我在Rails 3应用中获得了SystemStackError
。
我拥有的所有信息都是无用的一行堆栈跟踪(取自日志):
SystemStackError (stack level too deep):
activesupport (3.2.3) lib/active_support/callbacks.rb:409
所以问题是我如何查看完整的堆栈跟踪?
注意:我不关心为什么会发生这种情况,我想要的只是 它会发生。
使用:Rails 3.2.3,Unicorn。
感谢。
答案 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开发人员可能会遇到同样的问题,上面没有任何日志记录建议为我返回了有效的堆栈跟踪。