0

Animalいくつかのシミュレーション プログラムで使用する基本クラスがあります。この場合Animal、1 回の実行で最大 500 秒になる場合があります。Animal各実行は、「時間ステップ」ごとにそれぞれが何かを行うように設定されています。だから私は動物のリストをループして、DoTimeStepすべての時間ステップが実行されるまでそれぞれを呼び出します。

Animalクラスには、シミュレーションの「時間ステップ」ごとにデータを書き出すための独自のロガー クラスがあります。このようにして、それぞれAnimalに独自のログ ファイルがあります。仮想マシンで実行しようとするまで、永久に (3 年間) 正常に動作しました。次に、何らかの理由で、ロガー参照が「時間ステップ」に対して時々 null になり、次回はそこに表示されます。本当に奇妙な部分はStreamWriter、ロガーの内部がファイルの場所を見失うことがないように見えることです。その時間ステップの行を書き出すのをスキップするだけです。また、エラー ログにはNullReferenceExceptionLoggerクラスの a が表示されます。

この動作のパターンが見つかりません。Animalクラスは破棄および再作成されませんでした。ロガーはAnimalコンストラクターで作成され、 で破棄されIDisposeます。この問題のデバッグを開始する方法についてのアイデアはありますか?

編集:これを再現できるのは3匹の動物だけなので、500個の開いているファイルはそうではありません。しかし、試してくれてありがとう。

編集: Null Exception のエラーをキャッチしたときに何をすべきかわかりません。私はすでにそれを捕まえていましたが、なぜそれが起こっているのかを知る方法がわかりません. 鈍く見えてすみません。余談ですが、Thread.Sleep(300) を 10000 ループで試して、私が気付いていなかったある種のレースが行われているかどうかを確認しました。ループ内で not null になることはありませんでした。しかし、3 秒後に他の 2 匹の動物を循環して戻ってきたとき、それはもはや null ではありませんでした。

4

5 に答える 5

5

私は次のことをします。

  1. デバッガーでプログラムを実行するようにVSをセットアップします
  2. ヌル参照例外のファーストチャンス例外を有効にする
  3. デバッガー->例外->共通言語ランタイムの展開->System.NullReferenceExceptionに対してスローされたチェック
  4. プログラムを開始します
  5. 待って

再現するのに長い時間がかかるなら、私はそれを始めて、夜のために家に帰ります。午前中にお待ちしております;)

于 2009-02-24T18:29:56.970 に答える
2

競合状態のように聞こえます... スレッド間で共有されるデータを適切にロックしていますか?

編集: 競合状態でない場合、おそらく仮想マシンは 500 個のファイルを同時に開くことを好まないのではないかと推測されます...それについて調べましたか?

于 2009-02-24T18:28:02.653 に答える
0

競合状態のように聞こえます。この種の問題を解決するために私が思いついた最も簡単なパッチ修正は次のとおりです。

null変数が割り当てられている場所を見つけます。データを取得しているものが何であれ、nullを提供することがありますよね?

したがって、その場で確認してください。nullが返された場合は、300ミリ秒ほどスリープしてから、null以外になるまで再試行してください。

たとえば10秒以上失敗した場合は、エラーでベイルアウトします。無効な状態で続行させないでください。

于 2009-02-24T18:33:36.523 に答える
0

おそらく遅延初期化に関連して、マルチスレッドの問題が発生している可能性はありますか?

于 2009-02-24T18:26:19.397 に答える
0

それはVMに関連している可能性があります...ネイティブのC ++アプリケーションを使用したVMWareで同様のメモリの問題が発生し、理由もなくメモリが台無しになり、ITはVMに対して何もしていないと言います... (そして、それは彼らが VM に対して何かを行っていたことを意味することを私たちは皆知っています)

VM が電源を切られていない状態であるサーバーから別のサーバーにアクティブに移動されている場合、奇妙な動作が見られます (特にリソースが最初に閉じられた場合)。

とにかく、VM でしか再現できない場合は、専用のリソース (共有や部分プロセッサなどは使用しない) を使用して、開発 VM サーバー上でそれを分離し、再現できるかどうかを確認します。次に、そこから...再現できるようになるまで、同じタイプの環境を再度追加します。

于 2009-02-25T04:10:28.417 に答える