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

Программисты обычно используют трассировку стека во время интерактивной, а также посмертной отладки. Конечные пользователи могут увидеть трассировку стека как часть сообщения об ошибке, о которой они могут затем сообщить программисту.

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

В качестве примера, следующая программа Python содержит ошибку:

def a(): i = 0 j = b(i) return j

def b(z): k = 5 if z == 0: c() return k + z

def c(): error()

a()

При запуске программы в стандартном интерпретаторе Python появляется следующее сообщение об ошибке:

Traceback (most recent call last): File "tb.py", line 15, in <module> a() File "tb.py", line 3, in a j = b(i) File "tb.py", line 9, in b c() File "tb.py", line 13, in c error() NameError: name 'error' is not defined

Трассировка стека показывает, что ошибка возникла в функции c . Она также показывает, что функция c была вызвана функцией b, которая была вызвана функцией a, а та, в свою очередь, была вызвана кодом на 15-й строчке кода программы. Стековые кадры каждой из этих трёх функций были бы расположены в стеке таким образом, что функция a занимала нижнюю часть стека, а функция c - верхнюю.

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

См. также

Хвостовая рекурсия Переполнение стека Обработка исключений Стек вызовов

Категория:Статьи с примерами кода Python Категория:Отладка программ