5

Rails 3 / ruby​​ 1.9.2 webapp があります。時々 - 100000 分の 1 リクエストしかないかもしれません - 説明できないエラー レポートが表示されます。

正確なエラーはさまざまですが、ビュー内のインスタンス変数が突然 nil になるという行に沿っているようです。これの最も明確なインスタンスは最近発生しました。ヘルパー内のこのコードは -

 @swf_object_count||=0
 @swf_object_count+=1

- 「NoMethodError: nil:NilClass の未定義のメソッド `+'」が発生しました。ただし、エラーはこのケースに限定されないことに注意してください。これらの 2 行のコードは説明のみを目的としており、問題を「解決」するために回避できるものではありません。

エラーを再現することは基本的に不可能です。私は自分で見たことがなく、その結果としてのエラー レポートを見ただけです。REE から ruby​​ 1.9.2 に切り替えたときに最初にエラーが発生したと思います。

関連する場合と関連しない場合があるその他の詳細:

  • ユニコーンのフォークされたインスタンスを使用して、Solaris 10 で ruby​​1.9.2p290 を実行しています。
  • スレッドやファイバーは使用していません (修正: アプリ自体は使用していませんが、統計を収集/投稿するためのバックグラウンド スレッドを持つ NewRelic を使用しています)。
  • .haml ビューと .erb ビューが混在していますが、.haml からしか発生していません。(ただし、.erbs はあまりありません)
  • これがコントローラーコードで発生するのを見たことがありません
  • Bar.foomethod を決して呼び出さないという事実を知っているのに、「Bar のメソッド 'foomethod' が未定義です」に関するエラーをときどき見ました。これは、Bar オブジェクトが Foo ivar を自発的に置き換えた上記のバグに関連している可能性があります。

私はこれを追跡することにかなり困惑しています。何か提案はありますか、または似たような音を見た人はいますか?

4

2 に答える 2

0

ヘルパーでビューivarを操作するのはひどい考えです。なぜ並行性の問題が発生するのかはわかりませんが、コードの構造を変えると、並行性の問題は解消されると思います。

おそらく、ヘルパーに増分値を計算させることができ、ビューで次のようなことを行うことができます

@swf_object_count + swf_increment_helper_value

于 2011-10-20T14:01:01.093 に答える
0

私が最初に考えたのは糸や繊維でしたが、あなたはそれらを使用しないと言いました. うーん...これは古いセッションからトリガーされる可能性がありますか?

これは本当に非常に広範で大まかに定義された質問です..

おそらく、ログ ファイルを分析するスクリプトを作成し、いつ、どのルートでこれが発生するかを絞り込むことができます。しかし、それをデバッグするのも非常に困難です。なぜなら、途中でいくつかのコード変更を行った可能性があり、そのうちのいくつかは同様に見える可能性のある有効なエラーを生成したからです。

Unicorn インスタンスが停止してから再起動することがあり、現在のセッションが混乱する可能性があります。これは、実験したくなるかもしれません。たとえば、テスト環境で 2 つのユニコーンを使用し、セッションの途中で 1 つを強制終了して、それがログにどのように影響するかを確認します。

おそらく、例外がトリガーされるたびに Rails サーバーが詳細なログ記録を電子メールで送信する機能をインストールする必要があります..おそらく、そこで何が起こっているかをより可視化するための最良の方法です..

例: Gemfile 内のこの Gem:

# Receive exception notifications from production
gem 'exception_notification_rails3', :require => 'exception_notifier'

そして config/environments/production.rb ファイルで:

  config.middleware.use ExceptionNotifier,
    :email_prefix => "[Exception] ",
    :sender_address => %{"Exception Notifier" <your-system@your-domain.com>},
    :exception_recipients => %w{person1@your-domain.com person2@your-domain.com}

参照: https://github.com/railsware/exception_notification

于 2011-10-19T03:38:29.343 に答える