【问题标题】:Stack level too deep in activesupport callbacksactivesupport回调中的堆栈级别太深
【发布时间】:2012-05-03 01:44:28
【问题描述】:

我在 Rails 3 应用程序中获得了SystemStackError

我所拥有的所有信息都是无用的一行堆栈跟踪(取自日志):

SystemStackError (stack level too deep):
  activesupport (3.2.3) lib/active_support/callbacks.rb:409

所以问题是我如何查看完整的堆栈跟踪

注意:我不关心为什么会发生这种情况,我只想看看发生在哪里

使用:Rails 3.2.3,独角兽。

谢谢。

【问题讨论】:

  • 找到this page。不确定是否有帮助。
  • Careers 2.0 侧边栏claims to give good visibility into the details of running applications 中经常出现的一家公司——也许他们有工具可以定期为您转储堆栈跟踪并在导致错误之前捕获一个“正在运行”的深层跟踪?
  • @Riateche 问题发生在 Rails
  • @sarnold,我不会再添加一堆工具来查看堆栈跟踪。一定有什么东西把它切断了,想找出那是什么。
  • 您在保存前/保存后过滤器中的任何地方都有 .save 方法吗?

标签: ruby-on-rails ruby activerecord stack-trace activesupport


【解决方案1】:

如果您在 before_save 或 after_save 中更新活动记录,它将继续循环...... 此外,如果您在关联的两端都有 validates_associated。

以下是before_save 回调如何创建循环的示例:

class Foo < ActiveRecord::Base
  def before_save
    self.update_attribute(:bar, 'badidea')
  end
end

【讨论】:

  • 您好 Andrew,您能举个例子说明您如何准确地“更新 before_save 中的活动记录”吗?谢谢!
  • 有点难以在注释中放入代码,如下所示:class Foo
【解决方案2】:

这是 lib/active_support/callbacks.rb 中相当复杂的代码,但看起来它正在应用各种回调:准确地说::before、:after、:around。

您可以尝试在第 426 行之前放置一个老式的“放置在 #{name} 之前”,然后看看会得到什么。

同样,可能整个堆栈跟踪都在 rails 堆栈内,并且被默认的 backtrace_filter 过滤掉。关闭 backtrace_filter 可能会让您看到堆栈并获得调试线索。请参阅 config/initializers/backtrace_silencers.rb 并取消注释:

Rails.backtrace_cleaner.remove_silencers!

【讨论】:

    【解决方案3】:

    对于那些能够升级到 Ruby 2.2 的用户,由于 Nobu 在 MRI (https://bugs.ruby-lang.org/issues/6216) 上所做的工作,您应该获得更具描述性的堆栈跟踪。切换到 JRuby 也会提供更深的堆栈。

    【讨论】:

      【解决方案4】:

      这是飞镖中的一枪,但是当我在 validates_associated's 中有循环引用时,我曾经遇到过这样的事情

      【讨论】:

      • 是的,这是在黑暗中拍摄的。不,与验证无关。我知道是什么原因造成的。我不关心它发生的WHY。我想知道在哪里(所以想看看调用堆栈)。
      【解决方案5】:

      我遇到了类似的问题。在过滤器之前/之后跳过的控制器操作最终会出错并显示错误

      SystemStackError (stack level too deep):
        activesupport (3.2.13) lib/active_support/callbacks.rb:409
      

      我能想到的最好的办法是 Rails 向回调堆栈添加/删除方法的方式会在压力过大的情况下产生错误。

      这些是 API 调用,因此我将它们移至从 ActionController::Base 继承的单独控制器中,从而无需跳过过滤器。这解决了我的问题。 ApplicationController::Metal 可能是更好的选择,具体取决于您需要哪些功能。

      我知道提问者并不关心原因,但我认为其他 Rails 开发人员可能会遇到同样的问题,并且上面的日志记录建议都没有为我返回有效的堆栈跟踪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 2013-10-05
        • 2011-11-17
        • 2012-07-24
        • 2016-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多