В чем разница между трассировкой стека и обратной трассировкой?

Я действительно думал, что найду ответ в интернете, но я не мог. Есть какая-то разница? Люди говорят, что "backtrace" генерируется на чем-то, бросающем исключение, в то время как трассировка стека-это список вызовов методов от точки, когда приложение было запущено до точки, где было создано исключение. Если мы предполагаем трассировку стека как массив, то последним элементом будет метод, в котором было создано исключение. Будет ли это обратным случаем для обратного следа? В программировании язык, как Ruby, например, если у нас есть:

begin
  raise 1
rescue
  p $!.backtrace ; p caller(0) #=> displays the back-trace, then the stack-trace
end

они будут выводить 2 разных массива, что предполагает, что в них есть что-то принципиально другое.

1 ответов


"Backtrace", "трассировка стека", "backtrace стека" и т. д. названия для одного и того же. "Backtrace", скорее всего, происходит от одноименного инструмента Linux. Трассировка стека не относится только к исключениям - текущее состояние стека вызовов программы всегда может отображаться как трассировка стека (что делает backtrace, но и многие представления и инструменты отладчика). Просто полезно выводить трассировку стека во время исключений или ошибок.

Edit: Упс, думал, что я все еще в 'C' tag - но, глядя на документацию, оба исключения.backtrace и caller должны содержать массивы, где верхняя часть стека вызовов является первой в массиве. Там выглядят различия в том, как глубоко они идут и некоторые форматирования.