Пространства имён
Варианты
Действия

std::basic_stacktrace

Материал из cppreference.com
< cpp‎ | utility
 
 
Библиотека диагностики
Обработка исключений
Сбои обработки исключений
(до C++17*)
(до C++17*)
(C++11)(до C++17*)    
(до C++17*)
Коды ошибок
Коды ошибок
Категории исключений
(ТС TM)
Поддержка системных ошибок
(C++11)
(C++11)
Утверждения
Трассировка стека
basic_stacktrace
(C++23)
 
 
Определено в заголовочном файле <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)
1) Шаблон класса basic_stacktrace представляет собой снимок всей трассировки стека или её заданной части. Он соответствует требованиям AllocatorAwareContainer, SequenceContainer и ReversibleContainer, за исключением того, что поддерживаются только перемещение, присваивание, обмен и операции для const квалифицированных последовательных контейнеров, а семантика функций сравнения отличается от требуемой для контейнера.
2) Удобный псевдоним типа для basic_stacktrace с использованием значения по умолчанию std::allocator.
3) Удобный псевдоним типа для basic_stacktrace с использованием полиморфного аллокатора.

Последовательность вызова текущей оценки 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
(шаблон функции)
специализация алгоритма std::swap
(шаблон функции) [править]
(C++23)
возвращает строку с описанием класса basic_stacktrace
(шаблон функции) [править]
выполняет потоковый вывод класса 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

[править] Смотрите также

представление вычисления в трассировке стека
(класс) [править]