2014-10-20 56 views
7

虽然我可以在网上找到答案,但我不能。有没有什么区别?人们说,在引发异常的事件上会生成一个“回溯”,而堆栈跟踪是从应用程序启动到引发异常的时候的方法调用列表。如果我们认为堆栈跟踪是一个数组,那么最后一个元素就是抛出异常的方法。是否会出现反向追踪?在编程语言像Ruby,例如,如果我们有:堆栈跟踪和回溯之间有什么区别?

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

他们将输出2种不同的排列,这说明我还有一些关于他们根本不同的。

回答

5

“回溯”,“堆栈跟踪”,“堆栈回溯”等是同一事物的名称。 “Backtrace”特别可能来自同名Linux工具。堆栈跟踪并不仅仅指向异常 - 程序调用堆栈的当前状态总是可以显示为堆栈跟踪(该跟踪会执行,但许多调试器视图和工具也一样)。在异常或错误期间输出堆栈跟踪非常有用。

编辑:哎呀,我还以为'C'标签 - 但看着文档,Exception.backtrace和调用者都应该保持数组中第一个调用堆栈的顶部。看起来他们有多深度和一些格式的差异。

+1

当Ruby创建时Linux几乎不存在,我怀疑Ruby中的任何术语都是从那里派生出来的。 Ruby于1993年2月创建,Linux于1991年夏天发布.SLS是第一个发行Linux的版本,仅仅5个月的时间,并且在Ruby开始的时候,它就像地狱一样。 – 2014-10-20 14:06:09

+0

@JörgWMittag对我而言,你可能是对的,但这取决于Exception.backtrace何时添加。自从GNU工具倾向于使用这个术语(例如GDB和首先在Unix上存在的回溯工具)以来,它更可能是当时流行的术语。就像我说的 - 在这里意外!我很惊讶Ruby实际上是那么古老。 – 2014-10-20 14:19:29

+1

设想于1993年2月24日,1995年出版,1996年圣诞节出版。 – 2014-10-20 14:23:47