添加set_trace_func以调试SystemStackError后,“LocalJumpError:意外返回”

时间:2015-07-31 03:07:43

标签: ruby-on-rails ruby heroku return trace

我有一个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放在了错误的地方吗?

1 个答案:

答案 0 :(得分:1)

确定。一步一步。

我们在这里有两个不同的例外:

1.- SystemStackError:这可能是由于无限循环或非常大的堆栈。我们需要更多信息来调试它。选项:

  • 懒惰选项:请粘贴您的回溯。

  • DIY选项:进行交互式调试会话,我知道一种简单的方法来实现这一目标。恕我直言set_func_trace级别太低(无论这在Ruby中意味着什么:p)你想要调试的内容:

    • pryhttps://github.com/pry/pry)和pry-stack-explorerhttps://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或在没有块的方法内产生。