2012-05-03 63 views
8

我在Rails 3應用程序中獲得SystemStackError有效支持回調中堆棧級別太深

所有我掌握的信息是無用的堆棧跟蹤(從日誌取)的一行:

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

所以,問題是怎麼做的我看到完整的堆棧跟蹤

注意:我不關心爲什麼出現這種情況,我要的是看到的是哪裏它發生。

使用:Rails 3.2.3,Unicorn。

謝謝。

+0

找到[本頁](https://github.com/collectiveidea/delayed_job/issues/349)。不知道它是否有幫助。 –

+0

一家經常在Careers 2.0側欄中顯示的公司[聲稱可以很好地查看正在運行的應用程序的詳細信息](http://newrelic.com/ruby) - 也許他們有可以定期爲您轉儲堆棧跟蹤的工具,並捕獲一個深入的「實際行動」,然後導致錯誤? – sarnold

+0

@Riateche該問題發生在Rails <3.2.3中。我在3.2.3上。 –

回答

3

這是在LIB/active_support/callbacks.rb相當複雜的代碼,但看起來它是運用各種回調:前,:後,:圍繞,確切地說。

您可以嘗試在第426行之前放置一個老式的「放在#{name}之前」,然後看看您得到了什麼。

同樣,可能是整個堆棧跟蹤位於rails堆棧內部,並且正在被默認的backtrace_filter過濾掉。關閉backtrace_filter可能會讓你看到堆棧並獲得調試線索。請參閱config/initializers/backtrace_silencers.rb並取消註釋:

Rails.backtrace_cleaner.remove_silencers!

0

這是鏢出手,但我打這樣的事情一旦當我在validates_associated

+1

是的,這是在黑暗中的鏡頭。不,與驗證無關。我知道是什麼原因造成的。我不在乎*爲什麼會發生。我想知道*哪裏*(所以想看看callstack)。 –

5

如果更新活動記錄在它的before_save或after_save的,它會繼續循環有循環引用。 ... 此外,如果您有一個關聯的兩端validates_associated。

下面是一個before_save回調如何創建一個循環的例子:

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

嗨安德魯,你介意給你一個例子,你可以如何「更新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也會帶來更深的堆棧。