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, за исключением того, что поддерживаются только перемещение, присваивание, обмен и операции для 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.
#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
Смотрите также
(C++23) |
представление вычисления в трассировке стека (класс) |