Трассировки стека
В информатике трассировка стека ( дословно переводится с английского как «трассировка стека»), также называемая обратной трассировкой стека [1] или трассировкой стека [2] — это список фреймов стека, активных в данный момент времени во время выполнения программа . Когда программа запускается, память часто динамически распределяется в двух местах: в стеке и в куче . Технически, после того как блок памяти был выделен в стеке, его нельзя легко удалить, поскольку перед ним могут быть выделены другие блоки памяти. Всякий раз, когда функция вызывается в программе, блок памяти, называемый записью активации (или указателем стека), выделяется поверх стека времени выполнения. На высоком уровне запись активации выделяет память для параметров функции и локальных переменных, объявленных в функции.
Трассировка стека позволяет отслеживать последовательность вызываемых вложенных функций вплоть до момента создания трассировки стека. Это особенно полезно, когда трассировка генерируется в результате ошибки. По этой причине программисты обычно используют трассировку стека при отладке . Иногда даже конечный пользователь может увидеть трассировку стека как часть сообщения об ошибке , о чем он может позже сообщить программисту.
Пример
Возьмем, к примеру, следующую программу Python , содержащую ошибку:
защита ( ):
я = 0
дж знак равно б ( я )
вернуть j
защита б ( г ):
к = 5
если г == 0 :
с ()
вернуть к + г
деф с ():
ошибка ()
а ()
Запуск программы со стандартным интерпретатором Python приводит к следующему сообщению об ошибке:
Трассировка (последний последний вызов):
Файл «tb.py» , строка 15 , в <module>
a ()
Файл «tb.py» , строка 3 , в файле a
j = b ( i ) «
tb.py » , строка 9 , в b
c ()
Файл "tb.py" , строка 13 , в c
ошибка ()
NameError : имя "ошибка" не определено
Трассировка стека показывает, где произошла ошибка, то есть в функции c. В сообщении также сообщается, что функция cбыла вызвана пользователем b, что она была вызвана пользователем a, который, в свою очередь, был вызван кодом в строке 15 (последней) программы.
Языки программирования
Многие языки программирования, включая Java и C# , изначально поддерживают получение текущей трассировки стека с помощью соответствующих системных вызовов . C++ не имеет встроенной поддержки для этого, но программисты на C++ могут извлекать трассировки стека через специальные библиотеки , такие как stacktrace . В JavaScript исключения содержат свойство с именем (stack поэтому вызывается как err.stack), содержащее стек с точки, в которой он был выброшен; более того, большинство современных браузеров поддерживают вызов console.trace();. [3]
Примечания
- ^ Обратные следы | _ _ Библиотека GNU C , на gnu.org . Проверено 15 декабря 2020 г. .
- ^ Traceback — распечатайте или получите трассировку стека на docs.python.org . Проверено 15 декабря 2020 г. .
- ^ Console.tracee ( ) — веб-API § Совместимость с браузерами , на сайте developer.mozilla.org , MDN . Проверено 15 декабря 2020 г. .
Связанные элементы
- Контекст (ИТ)
- Переполнение стека
- Обработка исключений