std::basic_stacktrace — cppreference.com
Материал из cppreference.com
<tbody> </tbody>
| Определено в заголовочном файле |
||
|
|
(1) | (начиная с C++23) |
|
|
(2) | (начиная с C++23) |
|
|
(3) | (начиная с C++23) |
1) Шаблон класса basic_stacktrace представляет собой снимок всей трассировки стека или её заданной части. Он соответствует требованиям AllocatorAwareContainer, SequenceContainer и ReversibleContainer, за исключением того, что поддерживаются только перемещение, присваивание, обмен и операции для const квалифицированных последовательных контейнеров, а семантика функций сравнения отличается от требуемой для контейнера.
2) Удобный псевдоним типа для 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 функция-элемент) [править] | |
Функции, не являющиеся элементами
Вспомогательные классы
Примечание
Предусмотрена поддержка пользовательских аллокаторов для использования 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.
#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 (строки, заканчивающиеся стрелками '⤶', разделены по ширине): 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