close

Трассировки стека

Перейти к навигации Перейти к поиску

В информатике трассировка стека ( дословно переводится с английского как «трассировка стека»), также называемая обратной трассировкой стека [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]

Примечания

  1. ^ Обратные следы | _ _ Библиотека GNU C , на gnu.org . Проверено 15 декабря 2020 г. .
  2. ^ Tracebackраспечатайте или получите трассировку стека на docs.python.org . Проверено 15 декабря 2020 г. .
  3. ^ Console.tracee ( ) — веб-API § Совместимость с браузерами , на сайте developer.mozilla.org , MDN . Проверено 15 декабря 2020 г. .

Связанные элементы