在编写 ruby 代码时,我经常很难调试无限递归。有没有办法从 a 中获取回溯SystemStackError
以找出无限循环到底发生在哪里?
例子
给定一些方法foo
,它们在循环bar
中baz
相互调用:
def foo
bar
end
def bar
baz
end
def baz
foo
end
foo
当我运行此代码时,我只会收到消息test.rb:6: stack level too deep (SystemStackError)
。至少获取堆栈的最后 100 行会很有用,所以我可以立即看到这是一个 和 之间的循环,foo
如下所示:bar
baz
test.rb:6: stack level too deep (SystemStackError)
test.rb:2:in `foo'
test.rb:10:in `baz'
test.rb:6:in `bar'
test.rb:2:in `foo'
test.rb:10:in `baz'
test.rb:6:in `bar'
test.rb:2:in `foo'
[...]
有没有办法做到这一点?
编辑:
正如您从下面的答案中看到的那样,Rubinius 可以做到。不幸的是,一些rubinius 错误阻止我将它与我想调试的软件一起使用。所以准确地说,问题是:
如何使用 MRI(默认 ruby)1.9 获得回溯?