在编写ruby时,我常常难以调试无限递归.有没有办法从a SystemStackError中找到一个回溯来找出,究竟是无限循环发生在哪里?
给定一些方法foo,bar并baz在循环中相互调用:
def foo
bar
end
def bar
baz
end
def baz
foo
end
foo
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我只是收到消息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'
[...]
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
编辑:
从下面的答案可以看出,Rubinius可以做到.不幸的是,一些rubinius错误阻止我使用我想要调试的软件.所以准确的问题是:
如何获得MRI(默认红宝石)1.9的回溯?
我有一个相当大的,2.3升级到Rails 3应用程序,这足够胖它没有通过Heroku的60秒启动门,因此它崩溃了.我已经做了很多工作来最小化Gems和初始化器中的加载时间,但是有一些随机过程是燃烧时间,我不确定它是什么.我可以用另一双眼睛.
这是带有config.ru,application.rb和environment.rb以及Gemfile的GIST.
https://gist.github.com/2026140
任何想法将不胜感激.