Spec-Zone.ru › C++

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)
1) Шаблон класса basic_stacktrace представляет собой снимок всей трассировки стека или её заданной части. Он удовлетворяет требованиям AllocatorAwareContainer, SequenceContainer и ReversibleContainer, за исключением того, что поддерживаются только перемещение, присваивание, обмен и операции для константных последовательных контейнеров, а семантика функций сравнения отличается от требуемой для контейнера.
2) Удобный псевдоним типа для basic_stacktrace с использованием std::allocator по умолчанию.
3) Удобный псевдоним типа для basic_stacktrace с использованием полиморфного аллокатора.

Последовательность вызовов текущего вычисления \(\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
(открытая функция-член)
operator=
присваивает значение объекту basic_stacktrace
(открытая функция-член)
current
[статическая]
получает текущую трассировку стека или её заданную часть
(открытая статическая функция-член)
get_allocator
возвращает связанный аллокатор
(открытая функция-член)
Итераторы
begincbegin
возвращает итератор на начало
(открытая функция-член)
endcend
возвращает итератор на конец
(открытая функция-член)
rbegincrbegin
возвращает обратный итератор на начало
(открытая функция-член)
rendcrend
возвращает обратный итератор на конец
(открытая функция-член)
Ёмкость
empty
проверяет, пуста ли basic_stacktrace
(открытая функция-член)
size
возвращает количество записей трассировки стека
(открытая функция-член)
max_size
возвращает максимально возможное количество записей трассировки стека
(открытая функция-член)
Доступ к элементам
operator[]
обращается к указанной записи трассировки стека
(открытая функция-член)
at
обращается к указанной записи трассировки стека с проверкой границ
(открытая функция-член)
Модификаторы
swap
обменивает содержимое
(открытая функция-член)

Функции, не являющиеся членами

operator==operator<=>
(C++23)
сравнивает размеры и содержимое двух объектов basic_stacktrace
(шаблон функции)
std::swap(std::basic_stacktrace)
(C++23)
специализирует алгоритм std::swap
(шаблон функции)
to_string
(C++23)
возвращает строку с описанием basic_stacktrace
(шаблон функции)
operator<<
(C++23)
выводит basic_stracktrace в поток
(шаблон функции)

Вспомогательные классы

std::hash<std::basic_stacktrace>
(C++23)
поддержка хеширования для std::basic_stacktrace
(специализация шаблона класса)
std::formatter<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

См. также

stacktrace_entry
(C++23)
представление вычисления в трассировке стека
(класс)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/basic_stacktrace

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API