2012-06-15 13 views
5

Rails 2.4/Ruby 1.8.7からRails 3.1/Ruby 1.9.2にアップグレードするために、従来のコードベースに持ち込まれました。これを実行している間、私は把握しようと3日かかった非常に興味深い問題を発見しました。私は問題を見ている誰かのためにいくつかのGoogleのジュースを与えるために、そして質問をするためにここにドロップしたかった:なぜ?Ruby 1.9.2ではラックレベルのSystemStackErrorで、1.8.7ではありません

基本的には、アプリを実行しているときにラックレベルでSystemStackErrorが表示されていました。エラーが発生する前に要求を受け取ることができず、コードに触れなかったのでデバッグできませんでした。開発モードでは、サイトの多くを見ることができ、データベースがヒットしたときに突然SystemStackErrorを取得します。だから私はそれが怠惰な読み込みであると思った。

運用モードに切り替えると、最初の要求で例外が発生します。サーバーは正常に起動しますが、要求が送信されず、コードにも触れませんでした。私たちはここを参照してくださいすることはrendering.rbからlayouts.rburl_for.rbmetal.rbからシステムのサイクリングには

/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:102:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `new' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `block in action' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `call' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `dispatch' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:35:in `call' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:152:in `block in call' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:96:in `block in recognize' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:68:in `optimized_each' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:95:in `recognize' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:141:in `call' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:538:in `call' 
/Users/john/.rvm/gems/[email protected]/gems/omniauth-1.1.0/lib/omniauth/builder.rb:48:in `call' 
... 

です:

、早送り、あまりにも多くの時間が、私はRailsのループ(full gist)にトレースバックを突き止めurl_for.rbmetal.rbに等

かなりの努力の後、私は、モデルファイルの先頭に次の行(like so)にこれをダウン追跡:

include ActionView::Helpers::UrlHelpers 

注:これはクラス内ではなく、モジュールレベルにあります。

興味深いのは、です。これはRuby 1.8.7で動作しますが、Ruby 1.9.2ではSystemStackErrorが発生します。

私はGithub repository illustrating this behaviorを作成しました。

このリポジトリを取得してruby18ブランチを実行すると、ページをロードできます。 ruby19ブランチを実行すると、任意のリクエスト(Widgetがロードされていて、本番環境で実行し、遅延ロードされないリクエスト)でSystemStackErrorが発生します。

だから誰にも分かりますか?

Ruby 1.9がモジュールをロードする方法と関係があると思いますが、それは問題ではないようです。は、Railsコアでを引き起こしました。私の主な関心事は、これがコードベースでのプログラミングの怠慢に起因する難解な問題か、それがRubyやRailsの深い問題へのポインタであるかどうかという疑問です。

+0

私は同じ問題があります。私がテストスイート全体を起動した場合は、このエラーが発生しましたが、単一のテストを起動すると、スムーズに動作します。決議のニュースはありますか? thx – gicappa

+1

私の解決策は、ループを引き起こしていた '' 'include ActionView :: Helpers :: UrlHelpers'''を削除することでした。もしあなたがそれを持っていなければ、あなたのコードについて何も知らずに私の疑念があります。 – JohnMetta

+0

ありがとう、私は、テストでActionView :: Helpers :: TagHelperをインクルードしていたことを知りました。 – gicappa

答えて

1

これはBug 3144のようになり、ヘルパーを直接参照するようになります。

Rails.application.routes.url_helpers 
+0

私はそれを探しましたが、それを見つけられませんでした。ここにリンクしてくれてありがとう。 – JohnMetta

関連する問題