我有一个SystemStackError,其原因很难找到,所以要按照推荐的here找出:我添加了这个块:
module ApplicationHelper
set_trace_func proc {
|event, file, line, id, binding, classname|
if event == "call" && caller_locations.length > 500
fail "stack level too deep"
end
}
end
我将上面的块添加到app/helpers/application_helper.rb
,不确定它是最佳位置。
问题:
添加此内容后,我的应用程序立即失败并出现以下错误:
#<LocalJumpError: unexpected return>
INFO -- : worker=0 spawning...
ERROR -- : reaped #<Process::Status: pid 1440 exit 1> worker=0
INFO -- : worker=0 spawned pid=1443
INFO -- : Refreshing Gem list
我做错了什么?
我把set_trace_func
放在了错误的地方吗?
答案 0 :(得分:1)
确定。一步一步。
我们在这里有两个不同的例外:
1.- SystemStackError:这可能是由于无限循环或非常大的堆栈。我们需要更多信息来调试它。选项:
懒惰选项:请粘贴您的回溯。
DIY选项:进行交互式调试会话,我知道一种简单的方法来实现这一目标。恕我直言set_func_trace
级别太低(无论这在Ruby中意味着什么:p)你想要调试的内容:
pry
(https://github.com/pry/pry)和pry-stack-explorer
(https://github.com/pry/pry-stack_explorer)添加到您的项目中。将以下内容添加到ApplicationController
。
rescue_from SystemStackError do |exception|
binding.pry
end
启动服务器并复制您的错误。
进入控制台后,您可以使用exception.backtrace
检查回溯,并使用内部使用pry-stack-explorer
的{{1}}提供的魔法导航堆栈。
E.g。 binding.callers
然后使用show-stack
移动到所需的框架。在违规框架内,您可以检查所有行为和属性。
2.- LocalJumpError:这看起来像这一行:frame X
内的fail "stack level too deep"
,正在引发set_trace_func
RuntimeError
的儿子,StandardError
会影响救援的行为以前在堆栈中定义的,很可能是在ActiveSupport依赖加载机制中。
我无法重现这一点,但是如果您检查本地ActiveSupport安装,则很有可能会在该特定版本中提示。例如。来自你的shell的less $(bundle show activesupport)/lib/active_support/dependencies.rb
。
我引用ruby-doc.org:LocalJumpError意味着在块调用中有return
或在没有块的方法内产生。