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) |
basic_stacktrace представляет собой снимок всей трассировки стека или её заданной части. Он удовлетворяет требованиям AllocatorAwareContainer, SequenceContainer и ReversibleContainer, за исключением того, что поддерживаются только перемещение, присваивание, обмен и операции для константных последовательных контейнеров, а семантика функций сравнения отличается от требуемой для контейнера.Последовательность вызовов текущего вычисления \(\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.
Трассировка стека — это приближённое представление последовательности вызовов, состоящее из записей трассировки стека.
Запись трассировки стека представляет собой вычисление в трассировке стека. В стандартной библиотеке C++ она представлена типом std::stacktrace_entry.
Параметры шаблона
| Allocator | - | Аллокатор, используемый для выделения и освобождения памяти, а также для создания и уничтожения элементов в этой памяти. Тип должен удовлетворять требованиям Allocator. Программа некорректна, если Allocator::value_type не является std::stacktrace_entry. |
Типы-члены
| Тип-член | Определение |
|---|---|
value_type |
std::stacktrace_entry |
const_reference | constvalue_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 (открытая функция-член) |
|
присваивает значение объекту basic_stacktrace (открытая функция-член) |
|
|
[статическая] | получает текущую трассировку стека или её заданную часть (открытая статическая функция-член) |
| возвращает связанный аллокатор (открытая функция-член) |
|
Итераторы |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор на конец (открытая функция-член) |
|
| возвращает обратный итератор на начало (открытая функция-член) |
|
| возвращает обратный итератор на конец (открытая функция-член) |
|
Ёмкость |
|
проверяет, пуста ли basic_stacktrace (открытая функция-член) |
|
| возвращает количество записей трассировки стека (открытая функция-член) |
|
| возвращает максимально возможное количество записей трассировки стека (открытая функция-член) |
|
Доступ к элементам |
|
| обращается к указанной записи трассировки стека (открытая функция-член) |
|
| обращается к указанной записи трассировки стека с проверкой границ (открытая функция-член) |
|
Модификаторы |
|
| обменивает содержимое (открытая функция-член) |
|
Функции, не являющиеся членами
|
(C++23) | сравнивает размеры и содержимое двух объектов basic_stacktrace (шаблон функции) |
|
(C++23) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++23) | возвращает строку с описанием basic_stacktrace (шаблон функции) |
|
(C++23) | выводит basic_stracktrace в поток (шаблон функции) |
Вспомогательные классы
|
(C++23) | поддержка хеширования для 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) | Библиотека трассировки стека |
__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
См. также
|
(C++23) | представление вычисления в трассировке стека (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/basic_stacktrace