大きなファイルを処理するいくつかの作業をデバッグしようとしています。コード自体は機能しますが、.NETランタイム自体から散発的なエラーが報告されています。コンテキストとして、ここでの処理は1.5GBのファイル(メモリに1回だけロードされる)であり、ループで処理および解放されます。これは、この他の方法では予測できないエラーを意図的に再現しようとするためです。
私のテストフラグメントは基本的に次のとおりです。
try {
byte[] data =File.ReadAllBytes(path);
for(int i = 0 ; i < 500 ; i++)
{
ProcessTheData(data); // deserialize and validate
// force collection, for tidiness
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
}
} catch(Exception ex) {
Console.WriteLine(ex.Message);
// some more logging; StackTrace, recursive InnerException, etc
}
(タイミングやその他のものが投入されます)
ループは、非決定論的な反復回数で完全に正常に処理されます。問題はありません。その後、プロセスは突然終了します。例外ハンドラはヒットしません。テストには多くのメモリ使用が含まれますが、各反復中に非常にうまく鋸歯状になります(明らかなメモリリークはなく、十分なヘッドルームがあります-鋸歯状の最悪の時点で14GBの未使用のプライマリメモリ) 。プロセスは64ビットです。
Windowsのエラーログには3つの新しいエントリが含まれています。これらのエントリは(終了コード80131506を介して)実行エンジンエラー(厄介な小さな生き物)を示唆しています。関連する回答は、並行GCを無効にする「修正」を伴うGCエラーを示唆しています。ただし、この「修正」によって問題が防止されるわけではありません。
明確化:この低レベルのエラーはCurrentDomain.UnhandledException
イベントに影響しません。
明確化:GC.Collect
鋸歯状のメモリを監視し、メモリリークをチェックし、物事を予測可能に保つためだけにあります。それを削除しても問題は解決しません。反復間でより多くのメモリを保持し、dmpファイルを大きくします; p
さらにコンソールトレースを追加することで、次のそれぞれの間に障害が発生することを確認しました。
- デシリアライズ中(多くの割り当てなど)
- GC中(GC通知APIを使用したGC「アプローチ」とGC「完了」の間)
- 検証中(
foreach
一部のデータのすぐ上)-不思議なことに、検証中のGCが「完了」した直後
さまざまなシナリオがたくさんあります。
クラッシュダンプ(dmp)ファイルを取得できます。これをさらに調査して、システムが非常に見事に失敗したときにシステムが何をしているかを確認するにはどうすればよいですか?