在编写ruby时,我常常很难调试无限递归.有没有办法从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)
.至少得到堆栈的最后test.rb:6: stack level too deep (SystemStackError)
行是有用的,所以我可以立即看到这是一个介于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'
[...]
有没有办法做到这一点?
EDIT:
从下面的答案可以看出,鲁宾尼乌斯可以做到.不幸的是,大约有rubinius bugs人阻止我将其与我想要调试的软件一起使用.确切地说,问题是:
How do I get a backtrace with MRI (the default ruby) 1.9?