Введение

Отчет о стековых фреймах во время выполнения программы

В вычислительной технике, трассировка стека (также называемая обратной трассировкой стека или стековым трейсбеком) — это отчет об активных стековых фреймах в определенный момент времени во время выполнения программы. Когда программа запускается, память часто динамически выделяется в двух местах: стек и куча. Память непрерывно выделяется в стеке, но не в куче, что отражается в их названиях. Стек также относится к структуре программирования, поэтому для его различения этот стек называют стеком вызовов функций программы. Технически, после выделения блока памяти в стеке, его нельзя легко освободить, так как там могут быть другие блоки памяти, выделенные ранее. Каждый раз, когда в программе вызывается функция, поверх стека вызовов выделяется блок памяти, называемый записью активации. Обычно запись активации хранит аргументы функции и локальные переменные. Точное содержание и структура записи активации определяются соглашением о вызовах. Программисты часто используют трассировку стека во время интерактивной и посмертной отладки. Конечные пользователи могут увидеть трассировку стека, отображаемую как часть сообщения об ошибке, о которой пользователь может сообщить программисту. Трассировка стека позволяет отследить последовательность вложенных функций, вызванных до точки генерации трассировки. В сценарии посмертного анализа это распространяется до функции, в которой произошла ошибка (но не обязательно была вызвана ею). Вызовы функций, не являющиеся вложенными, не отображаются в трассировке стека.

Языковая поддержка

Многие языки программирования, включая Java и C#, имеют встроенную поддержку для получения текущего стека вызовов через системные вызовы. До добавления `std::stacktrace` в стандартную библиотеку как контейнера для элементов стека вызовов, в версиях C++ до C++23 не было встроенной поддержки для этого, но пользователи C++ могут получать стеки вызовов с помощью (например) библиотеки stacktrace. В JavaScript исключения содержат свойство `stack`, которое содержит стек вызовов из места, где исключение было выброшено.