Трассировки стека - Stack trace

В вычисление, а трассировки стека (также называется трассировка стека[1] или трассировка стека[2]) - отчет об активном кадры стека в определенный момент времени во время выполнения программа. Когда программа запущена, память часто динамически выделяется в двух местах; то стек и куча. Память постоянно выделяется в стеке, но не в куче, что отражает их имена. Стек также относится к программной конструкции, поэтому для отличия этот стек называется программным. стек времени выполнения. Технически, как только блок памяти был выделен в стеке, его нелегко удалить, поскольку могут быть другие блоки памяти, которые были выделены до него. Каждый раз, когда функция вызывается в программе, блок памяти выделяется поверх стека выполнения, называемого запись активации (или указатель стека.) На высоком уровне запись активации выделяет память для параметров функции и локальных переменных, объявленных в функции.

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

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

Например, следующие Python программа содержит ошибку.

 1 def а(): 2     я = 0 3     j = б(я) 4     вернуть j 5  6 def б(z): 7     k = 5 8     если z == 0: 9         c()10     вернуть k + z11 12 def c():13     ошибка()14 15 а()

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

Отслеживание (последний вызов последний):  файл "tb.py", линия 15, в <module>    а()  файл "tb.py", линия 3, в а    j = б(я)  файл "tb.py", линия 9, в б    c()  файл "tb.py", линия 13, в c    ошибка()NameError: имя 'ошибка' не определено

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

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

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

Смотрите также

использованная литература

  1. ^ "Руководство по libc: трассировки". gnu.org. Получено 8 июля 2014.
  2. ^ "трассировка - Распечатать или получить трассировку стека". python.org. Получено 8 июля 2014.