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.
Стек вызовов — приблизительное представление последовательности вызовов и состоит из записей стека вызовов.
Запись стека вызовов представляет вычисление в стеке вызовов. Она представлена 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 (публичная функция-член) |
|
присваивает значение 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) | Библиотека 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
См. также
|
(C++23) | представление элемента стека вызовов (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/basic_stacktrace