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 = |
(3) | (начиная с C++23) |
basic_stacktrace
представляет собой снимок всей трассировки стека или её заданной части. Он соответствует требованиям AllocatorAwareContainer, SequenceContainer и ReversibleContainer, за исключением того, что поддерживаются только перемещение, присваивание, обмен и операции для const квалифицированных последовательных контейнеров, а семантика функций сравнения отличается от требуемой для контейнера.basic_stacktrace
с использованием значения по умолчанию std::allocator.Последовательность вызова текущей оценки x0 в текущем потоке выполнения представляет собой последовательность (x0, ..., xn) таких оценок, что для i≥0, xi находится внутри вызова функции xi+1.
Трассировка стека является приблизительным представлением последовательности вызовов и состоит из записей трассировки стека.
Запись трассировки стека представляет оценку в трассировке стека. В стандартной библиотеке C++ она представлена std::stacktrace_entry.
Содержание |
[править] Параметры шаблона
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 (public функция-элемент) | |
уничтожает basic_stacktrace (public функция-элемент) | |
присваивает классу basic_stacktrace (public функция-элемент) | |
[static] |
получает текущую трассировку стека или её заданную часть (public static функция-элемент) |
возвращает связанный аллокатор (public функция-элемент) | |
Итераторы | |
возвращает итератор на начало (public функция-элемент) | |
возвращает итератор на конец (public функция-элемент) | |
возвращает обратный итератор на начало (public функция-элемент) | |
возвращает обратный итератор на конец (public функция-элемент) | |
Ёмкость | |
проверяет, пуст ли basic_stacktrace (public функция-элемент) | |
возвращает количество записей трассировки стека (public функция-элемент) | |
возвращает максимально возможное количество записей трассировки стека (public функция-элемент) | |
Доступ к элементам | |
получает доступ к указанной записи трассировки стека (public функция-элемент) | |
доступ к указанной записи трассировки стека с проверкой границ (public функция-элемент) | |
Модификаторы | |
обменивает содержимое (public функция-элемент) |
[править] Функции, не являющиеся элементами
(C++23) |
сравнивает размеры и содержимое двух значений basic_stacktrace (шаблон функции) |
специализация алгоритма std::swap (шаблон функции) | |
(C++23) |
возвращает строку с описанием класса basic_stacktrace (шаблон функции) |
(C++23) |
выполняет потоковый вывод класса basic_stracktrace (шаблон функции) |
[править] Вспомогательные классы
поддержка хэширования для std::basic_stacktrace (специализация шаблона класса) | |
поддержка форматирования для 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) | Библиотека трассировки стека |
__cpp_lib_formatters |
202302L | (C++23) | Форматирование std::thread::id и std::stacktrace |
[править] Пример
Вывод, полученный с помощью Compiler Explorer: msvc и gcc.
Возможный вывод:
// вывод msvc (строки, заканчивающиеся стрелками '⤶', разделены по ширине): 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
[править] Смотрите также
(C++23) |
представление вычисления в трассировке стека (класс) |