Spec-Zone.ru › C++

std::basic_stacktrace

Определено в заголовке <stacktrace>
template< class Allocator >
class basic_stacktrace;
(1) (с C++23)
using stacktrace =
    std::basic_stacktrace<std::allocator<std::stacktrace_entry>>;
(2) (с C++23)
namespace pmr {
using stacktrace =
    std::basic_stacktrace<std::pmr::polymorphic_allocator<std::stacktrace_entry>>;
}
(3) (с C++23)
1) Шаблон класса basic_stacktrace представляет собой снимок всего стека вызовов или его заданной части. Он удовлетворяет требованиям AllocatorAwareContainer, SequenceContainer и ReversibleContainer, за исключением того, что поддерживаются только операции перемещения, присваивания, обмена и операции для константных последовательных контейнеров, а семантика функций сравнения отличается от требуемой для контейнера.
2) Удобный тип-псевдоним для basic_stacktrace, используя по умолчанию std::allocator.
3) Удобный тип-псевдоним для basic_stacktrace, используя полиморфный аллокатор.

Последовательность вызовов текущего вычисления \(\small{ {x}_{0} }\)x0 в текущей потоке выполнения представляет собой последовательность \(\small{ ({x}_{0}, \dots, {x}_{n})}\)(x0, ..., xn) вычислений, такая что для \(\small{i \ge 0}\)i≥0, \(\small{ {x}_{i} }\)xi находится внутри вызова функции \(\small{ {x}_{i+1} }\)xi+1.

Стек вызовов — приблизительное представление последовательности вызовов и состоит из записей стека вызовов.

Запись стека вызовов представляет вычисление в стеке вызовов. Она представлена std::stacktrace_entry в стандартной библиотеке C++.

Параметры шаблона

Allocator - Аллокатор, используемый для получения/освобождения памяти и для построения/разрушения элементов в этой памяти. Тип должен соответствовать требованиям Allocator. Программа некорректна, если Allocator::value_type не std::stacktrace_entry.

Типы-члены

Тип-член Определение
value_type std::stacktrace_entry
const_reference const value_type&
reference value_type&
const_iterator определённый реализацией константный LegacyRandomAccessIterator тип, который соответствует random_access_iterator
iterator const_iterator
reverse_iterator std::reverse_iterator<iterator>
reverse_const_iterator std::reverse_iterator<const_iterator>
difference_type тип целого числа со знаком, определённый реализацией
size_type тип целого беззнакового числа, определённый реализацией
allocator_type Allocator

Члены-функции

(конструктор)
создаёт новый basic_stacktrace
(публичная функция-член)
(деструктор)
уничтожает basic_stacktrace
(публичная функция-член)
operator=
присваивает значение basic_stacktrace
(публичная функция-член)
current
[статическая]
получает текущий стек вызовов или его заданную часть
(публичная статическая функция-член)
get_allocator
возвращает связанный аллокатор
(публичная функция-член)
Итераторы
begincbegin
возвращает итератор к началу
(публичная функция-член)
endcend
возвращает итератор к концу
(публичная функция-член)
rbegincrbegin
возвращает обратный итератор к началу
(публичная функция-член)
rendcrend
возвращает обратный итератор к концу
(публичная функция-член)
Емкость
empty
проверяет, пуст ли basic_stacktrace
(публичная функция-член)
size
возвращает количество записей стека вызовов
(публичная функция-член)
max_size
возвращает максимальное возможное количество записей стека вызовов
(публичная функция-член)
Доступ к элементам
operator[]
доступ к заданной записи стека вызовов
(публичная функция-член)
at
доступ к заданной записи стека вызовов с проверкой границ
(публичная функция-член)
Модификаторы
swap
меняет местами содержимое
(публичная функция-член)

Функции вне класса

operator==operator<=>
(C++23)
сравнивает размеры и содержимое двух значений basic_stacktrace
(шаблон функции)
std::swap(std::basic_stacktrace)
(C++23)
специализирует алгоритм std::swap
(шаблон функции)
to_string
(C++23)
возвращает строку с описанием basic_stacktrace
(шаблон функции)
operator<<
(C++23)
выполняет вывод в поток basic_stracktrace
(шаблон функции)

Вспомогательные классы

std::hash<std::basic_stacktrace>
(C++23)
поддержка хэширования для std::basic_stacktrace
(специализация шаблона класса)
std::formatter<std::basic_stacktrace>
(C++23)
поддержка форматирования для basic_stacktrace
(специализация шаблона класса)

Примечания

Поддержка пользовательских аллокаторов предоставляется для использования basic_stacktrace в горячих точках или встраиваемых средах. Пользователи могут выделять объекты stacktrace_entry в стеке или в другом подходящем месте.

Последовательность объектов std::stacktrace_entry, принадлежащих std::basic_stacktrace, является неизменяемой и либо пустой, либо представляет собой непрерывный интервал всего стека вызовов.

boost::stacktrace::basic_stacktrace (доступно в Boost.Stacktrace) может быть использовано вместо std::basic_stacktrace, если оно недоступно.

Макрокоманда проверки наличия функции Значение Стандарт Функция
__cpp_lib_stacktrace 202011L (C++23) Библиотека Stacktrace
__cpp_lib_formatters 202302L (C++23) Форматирование std::thread::id и std::stacktrace

Пример

Вывод, полученный с помощью Compiler Explorer: msvc и gcc.

#include <iostream>
#include <stacktrace>
 
int nested_func(int c)
{
    std::cout << std::stacktrace::current() << '\n';
    return c + 1;
}
 
int func(int b)
{
    return nested_func(b + 1);
}
 
int main()
{
    std::cout << func(777);
}

Возможный вывод:

// msvc output (the lines ending with '⤶' arrows are split to fit the width):
0> C:\Users\ContainerAdministrator\AppData\Local\Temp\compiler-explorer-compiler20221122-⤶
31624-2ja1sf.8ytzw\example.cpp(6): output_s!nested_func+0x1F
1> C:\Users\ContainerAdministrator\AppData\Local\Temp\compiler-explorer-compiler20221122-⤶
31624-2ja1sf.8ytzw\example.cpp(12): output_s!func+0x15
2> C:\Users\ContainerAdministrator\AppData\Local\Temp\compiler-explorer-compiler20221122-⤶
31624-2ja1sf.8ytzw\example.cpp(15): output_s!main+0xE
3> D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288): output_s!⤶
__scrt_common_main_seh+0x10C
4> KERNEL32!BaseThreadInitThunk+0x14
5> ntdll!RtlUserThreadStart+0x21
779
 
gcc output:
   0# nested_func(int) at /app/example.cpp:7
   1# func(int) at /app/example.cpp:13
   2#      at /app/example.cpp:18
   3#      at :0
   4#      at :0
   5# 
 
779

См. также

stacktrace_entry
(C++23)
представление элемента стека вызовов
(класс)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/basic_stacktrace

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API