8

我正在SystemStackError使用 Rails 3 应用程序。

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

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

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

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

使用:Rails 3.2.3,独角兽。

谢谢。

4

5 回答 5

5

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

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

class Foo < ActiveRecord::Base
  def before_save
    self.update_attribute(:bar, 'badidea')
  end
end
于 2012-05-04T01:52:11.897 回答
3

这是 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!

于 2012-05-26T12:41:07.180 回答
1

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

于 2015-03-28T10:45:51.430 回答
0

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

于 2012-05-03T06:33:16.610 回答
0

我有一个类似的问题。在过滤器之前/之后跳过的控制器操作最终会因错误而出错

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

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

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

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

于 2013-09-30T22:29:44.933 回答