これをデバッグする方法がわかりません。.NET 4.5で実行されているマネージコードのみで構成されるC#プログラムがあります。しばらく実行した後、一見ランダムな時間に、「mscorlib.dllでタイプ「System.AccessViolationException」の未処理の例外が発生しました」というエラーが表示されます。Visual Studio(2012)から実行しているので、[中断]をクリックすると、次の呼び出しスタックが表示されます。
mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x47 bytes
[Native to Managed Transition]
ntdll.dll!_NtRequestWaitReplyPort@12() + 0xc bytes
kernel32.dll!_ConsoleClientCallServer@16() + 0x4f bytes
kernel32.dll!_GetConsoleLangId@4() + 0x2b bytes
kernel32.dll!_SetTEBLangID@0() + 0xf bytes
KernelBase.dll!_GetModuleHandleForUnicodeString@4() + 0x22 bytes
mdnsNSP.dll!7177aa48()
[Frames below may be incorrect and/or missing, no symbols loaded for mdnsNSP.dll]
mdnsNSP.dll!71775b06()
mdnsNSP.dll!71774ded()
mdnsNSP.dll!71774e8c()
bcryptprimitives.dll!746d1159()
bcryptprimitives.dll!746d1137()
ntdll.dll!_LdrpCallInitRoutine@16() + 0x14 bytes
ntdll.dll!_NtTestAlert@0() + 0xc bytes
ntdll.dll!_NtContinue@8() + 0xc bytes
ntdll.dll!_LdrInitializeThunk@8() + 0x1a bytes
私が気付いた興味深いことは、コールスタックには私のコードが何もないということです。
問題のルートを見つけるためにどのような戦略を使用することをお勧めしますか?または、これに似た問題を見つけて、ヒントがありますか?
例外には私のコードが含まれていないようであるため、質問に答えるのに役立つ情報を含めるかどうかはわかりませんが、他に含める必要がある情報があるかどうかを尋ねてください。
エラーはIOに関連している可能性があるため(PerformIOCompletionCallbackはスタックの最上位にあるため)、これはこのアプリケーションが実行する一般的なIOタスクのリストです。
- TcpListener.AcceptTcpClientAsync
- NetworkStream.Write/BeginRead/EndRead
- SqlCommand.BeginExecuteReader / EndExecuteReader
- StreamWriter.WriteLine
その他の注意事項:
- 大まかに再現できるようです。同じ場所で同じエラーが発生しますが(PerformIOCompletionCallback)、取得するには別の時間(分単位)待つ必要があります。
- 問題を確実に浮き彫りにする小さなプログラムを作ることはできないと思います。私のプログラムは、このエラーが発生する前に、何千もの同様のIO操作を処理します。
編集:
@KevinによるMdnsnsp.dllはBonjourからのものであるという提案に基づいて、Bonjourをアンインストールして再試行しました。例外は存続しますが、呼び出しスタックははるかにクリーンです。
mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x47 bytes
[Native to Managed Transition]
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
Bonjourインストーラーがネットワークトラフィック用の無害なフックDLLをインストールしたと思いますが、それをアンインストールしても問題は解決しませんでした。
編集:
unsafe
疑わしいものとしてそれを排除するために、より遅い「安全な」同等物を使用してすべての関数を一時的に再コーディングしました。現在、アプリケーション内のどのアセンブリも、安全でないスイッチを使用してコンパイルされていません。問題はまだ解決していません。繰り返しになりますが、このアプリケーションには安全でないコード、ネイティブコード、P / Invoke呼び出し(ユーザーコード内)はありませんが、AccessViolationException
上記のような問題が発生しています。