【问题标题】:"LocalJumpError: unexpected return" after adding a set_trace_func to debug a SystemStackError添加 set_trace_func 以调试 SystemStackError 后出现“LocalJumpError:意外返回”
【发布时间】:2015-07-31 03:07:42
【问题描述】:

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

【问题讨论】:

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


    【解决方案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 提供的一些魔法导航堆栈,它在内部使用binding.callers

        例如show-stack 然后使用frame X 移动到所需的帧。然后,您可以在违规框架内检查所有行为和属性。

    2.- LocalJumpError:这看起来像这样一行:fail "stack level too deep" 在你的set_trace_func 中,正在引发RuntimeErrorStandardError 的儿子,这会影响先前在堆栈中定义的救援行为,很可能在 ActiveSupport 依赖加载机制中。

    我无法重现此内容,但如果您检查本地 ActiveSupport 安装,则很有可能在该特定版本中有提示。例如。 less $(bundle show activesupport)/lib/active_support/dependencies.rb 来自你的 shell。

    我将引用 ruby​​-doc.org:LocalJumpError 意味着在块调用中包含 return 或在没有块的方法中产生。

    【讨论】:

    • "paste your backtrace":如果我理解正确,您希望我在 somewhere 插入一条 Ruby 指令,将堆栈跟踪输出到某个什么样的日志?问题:somewhere 还不知道,我不知道无限循环发生在哪里。
    • 我的$(bundle show activesupport)/lib/active_support/dependencies.rb 不包含字符串trace。不过它有一个protected def log_call(*args)。它还多次包含return 关键字。
    • 1.- 如果您按照我的 DIY 选项进行操作,那么在您复制错误后,您最终会在服务器进程中使用 rails 控制台。在该控制台中,您将能够使用 exception.backtrace 获取回溯。
    • 2.- 为什么要查找字符串“trace”?我想知道更多关于你的逻辑。我建议您阅读有关 ruby​​ 块以及 yield 工作原理的更多信息。
    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2012-12-05
    • 2023-04-03
    相关资源
    最近更新 更多