マルチスレッド アプリケーションを実行すると NullReferenceException が発生しますが、これはデバッガーの外部でリリース モードで実行した場合に限られます。スタック トレースはログに記録され、常に同じ関数呼び出しを指します。関数にログ ステートメントをいくつか入れて、どれだけ到達するかを判断しようとしました。関数の最後の行にあるステートメントを含め、すべてのステートメントがログに記録されます。興味深いのは、NullReferenceException が発生すると、関数呼び出しの後のステートメントがログに記録されないことです。
// ...
logger.Log( "one" ); // logged
Update( false );
logger.Log( "eleven" ); // not logged when exception occurs
}
private void Update( bool condition )
{
logger.Log( "one" ); // logged
// ...
logger.Log( "ten" ); // logged, even when exception occurs
}
関数が呼び出されるたびに例外が発生するわけではありません。関数の実行前または実行中にスタックが破損して、戻りアドレスが失われ、null 参照が発生する可能性はありますか? .NET でそのようなことが可能だとは思いませんでしたが、もっと奇妙なことが起こったと思います。
関数の呼び出しを関数の内容に置き換えてみたので、すべてがインラインで発生し、次のような行で例外が発生します。
foreach ( ClassItem item in classItemCollection )
「classItemCollection」がnullではないことをログで確認しました。また、IEnumeratorが何かおかしいことをしている場合に備えて、foreachをforに変更しようとしましたが、同じ行で例外が発生しました。
これをさらに調査する方法についてのアイデアはありますか?
更新:何人かのレスポンダーが、ロガーが null でないことを確認することに関する可能な解決策を提案しています。明確にするために、ログ ステートメントは、例外が発生し始めた後にデバッグ目的で追加されました。