8

SystemStackErrorRails3アプリで取得しています。

私が持っているすべての情報は、(ログから取得した)スタックトレースの1行では役に立ちません。

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

だから問題は、完全なスタックトレースをどのように見るかです。

:これが発生する理由は気にしません。必要なのは、発生する場所だけです。

使用:Rails 3.2.3、Unicorn。

ありがとう。

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 行目の前に昔ながらの「puts before #{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

同様の問題がありました。フィルターの前/後をスキップしていたコントローラー アクションは、最終的にエラーでエラーになります。

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 に答える
0

validates_associatedこれはダーツのショットですが、私の中に循環参照があったときに、このようなものを一度ヒットしました

于 2012-05-03T06:33:16.610 に答える