2012-05-03 11 views
8

SystemStackErrorがRails 3アプリになっています。スタックレベルがアクティブサポートコールバックで深すぎます

私が持っているすべての情報は、(ログから取られた)スタックトレースの役に立たない1行です:

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

そこで問題が行う、私は完全なスタックトレースを参照してください方法ですか?

NOTE:これはなぜ起こるか私は気にしないが、約、私が望むすべてが見ていることが起こるです。

使用方法:Rails 3.2.3、Unicorn。

ありがとうございました。

+0

[このページ](https://github.com/collectiveidea/delayed_job/issues/349)が見つかりました。それが役立つかどうかは分かりません。 –

+0

キャリア2.0のサイドバーに頻繁に掲載されている会社[アプリケーションの実行状況をよく見せると主張する](http://newrelic.com/ruby) - 定期的にスタックトレースをダンプしてキャッチできるツールがあるそれは間違いにつながる前に "アクションで"深い一つ? – sarnold

+0

@Riatecheその問題はRails <3.2.3で発生します。私は3.2.3です。 –

答えて

3

のlib/active_support/callbacks.rbではかなり複雑なコードですが、それはさまざまなコールバックを適用しているように見えます::前、:after、:around、正確にする。

426行目の前に古い「puts#{name}」を置き、何を得るかを見てみるとよいでしょう。

同様に、スタックトレース全体がレールスタック内にあり、デフォルトのbacktrace_filterによってフィルタされている可能性があります。 backtrace_filterをオフに設定すると、スタックを見てデバッグのヒントを得ることができます。 config/initializers/backtrace_silencers.rbを参照し、コメントを外してください:

Rails.backtrace_cleaner.remove_silencers!

0

これは、ダーツでショットですが、私はあなたがそれでアクティブなレコードがbefore_saveまたはafter_saveだ更新した場合、それがループし続けます私のvalidates_associated

+1

ええ、それは暗闇の中のショットです。そして、いいえ、検証とは関係ありません。私はそれを引き起こす原因を知っている。私は気にしない*なぜそれが起こるか。私は知ってほしい*どこ*(ので、コールスタックを参照してください)。 –

5

で循環参照を持っていたとき、私はかつてこのような何かをヒット。 ... また、関連の両端でvalidates_associatedがある場合。ここで

before_saveコールバックは、ループを作成する方法の例です:

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

こんにちはAndrew、「before_saveのアクティブなレコードをどのように更新できるか」という例を教えてもらえますか?ありがとうございました! – Alexandra

+0

コードに入れるのは難しいですが、これは次のようなものです:class Foo

0

私は同様の問題がありました。前スキップされたコントローラのアクション/フィルタは、最終的にエラー

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

で出エラーでしょう後、私は理解することができますベストRailsはコールバックスタックにメソッドを削除/追加の方法は、重いストレスでエラーを作成するだろうということです。

これらはAPI呼び出しなので、ActionController :: Baseから継承した別のコントローラーに移動し、フィルターをスキップする必要がなくなりました。これは私の問題を解決しました。 ApplicationController :: Metalは、必要な機能に応じてより良い選択となる場合があります。

質問者は理由を気にしていなかったと知っていますが、他のRails開発者が同じ問題を抱えている可能性があります。

1

Ruby 2にアップグレードできる人向けです。2の場合、NobuがMRI(https://bugs.ruby-lang.org/issues/6216)で行った作業の結果として、より説明的なスタックトレースを取得する必要があります。 JRubyに切り替えると、より深いスタックが得られます。

関連する問題