gpt4 book ai didi

ruby - 如何从 SystemStackError : stack level too deep? 获取回溯

转载 作者:数据小太阳 更新时间:2023-10-29 06:21:38 25 4
gpt4 key购买 nike

在编写 ruby​​ 代码时,我常常很难调试无限递归。有没有办法从 SystemStackError 中获取回溯?找出无限循环发生的确切位置?

例子

给定一些方法 foo , barbaz在循环中互相调用:

def foo
bar
end

def bar
baz
end

def baz
foo
end

foo

当我运行这段代码时,我只收到消息 test.rb:6: stack level too deep (SystemStackError) .至少获取堆栈的最后 100 行会很有用,因此我可以立即看出这是 foo 之间的循环。 , barbaz ,像这样:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com