作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在编写 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)
.至少获取堆栈的最后 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 bugs阻止我将它与我想调试的软件一起使用。所以准确地说,问题是:
如何使用 MRI(默认 ruby)1.9 获取回溯?
最佳答案
对于那些后来发现这个问题的人的另一种方法...... excellent gist提供有关在控制台中启用跟踪功能并将所有函数调用打印到文件的说明。刚刚在 1.9.3-p194 上测试过,效果很好。
包括这里以防有一天要点消失:
$enable_tracing = false
$trace_out = open('trace.txt', 'w')
set_trace_func proc { |event, file, line, id, binding, classname|
if $enable_tracing && event == 'call'
$trace_out.puts "#{file}:#{line} #{classname}##{id}"
end
}
$enable_tracing = true
a_method_that_causes_infinite_recursion_in_a_not_obvious_way()
关于ruby - 如何从 SystemStackError : stack level too deep? 获取回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11544460/
我是一名优秀的程序员,十分优秀!