計算コストの高いマルチスレッドC#アプリがあり、30〜90分の実行後に一貫してクラッシュするようです。それが与えるエラーは
ランタイムで致命的なエラーが発生しました。エラーのアドレスは、スレッド0xbccの0xec37ebaeにありました。エラーコードは0xc0000005です。このエラーは、CLRのバグ、またはユーザーコードの安全でない部分または検証できない部分のバグである可能性があります。このバグの一般的な原因には、COM-interopまたはPInvokeのユーザーマーシャリングエラーがあり、スタックが破損する可能性があります。
(0xc0000005はアクセス違反のエラーコードです)
私のアプリは、ネイティブコードを呼び出したり、安全でないブロックを使用したり、CLSに準拠していないタイプのようなものを使用したりしませんuint
。実際、デバッガーがクラッシュを引き起こしたと言っているコード行は
overallLength += distanceTravelled;
両方の値がタイプの場合double
これらすべてを考慮すると、クラッシュはコンパイラ、CLR、またはJITのバグが原因であるに違いないと思います。何が原因なのかを解明したいのですが、少なくともMicrosoftに送信するための小さな複製を作成したいのですが、どこから始めればよいのかさえわかりません。CILバイナリ、コンパイルされたJIT出力、またはネイティブスタックトレース(クラッシュ時に管理されたスタックトレースはありません)を表示する必要がなかったので、方法がわかりません。クラッシュ時のすべての変数の状態を表示する方法さえ理解できません(残念ながら、VSは管理された例外の後のように私に教えてくれません、そしてそれらをコンソール/ファイルに出力すると遅くなりますアプリは1000倍ですが、これは明らかにオプションではありません)。
では、これをデバッグするにはどうすればよいですか?
[編集]最新バージョンの.Net4.0クライアントプロファイルを実行しているVS2010SP1でコンパイルされました。どうやらそれは「.Net4.0C/.Net 4.0E、.NetCLR1.1.4322」です