在activesupport回调中堆栈级别太深

时间:2012-05-03 01:44:28

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

我在Rails 3应用中获得了SystemStackError

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

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

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

注意:我不关心为什么会发生这种情况,我想要的只是 它会发生。

使用:Rails 3.2.3,Unicorn。

感谢。

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

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

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

  

Rails.backtrace_cleaner.remove_silencers!

答案 2 :(得分:1)

对于那些能够升级到Ruby 2.2的人来说,由于Nobu在MRI(https://bugs.ruby-lang.org/issues/6216)上完成的工作,你应该获得更具描述性的堆栈跟踪。切换到JRuby也会产生更深的堆栈。

答案 3 :(得分:0)

这是飞镖的一个镜头,但是当我在validates_associated

中有循环引用时,我曾经碰过这样的东西

答案 4 :(得分:0)

我有类似的问题。在过滤器之前/之后跳过的控制器动作最终将错误输出错误

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

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

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

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