23

これをデバッグする方法がわかりません。.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上記のような問題が発生しています。

4

3 に答える 3

3

エラーの原因となっている PerformIOCompletionCallback であるため、非同期 IO 呼び出しを調べます。

  • TcpListener.AcceptTcpClientAsync
  • NetworkStream.Write/BeginRead/EndRead
  • SqlCommand.BeginExecuteReader/EndExecuteReader

登録されたハンドルが無効になっているため、エラーが発生しているようです。これはマネージ コードで発生しているため、原因はサード パーティのネイティブ DLL ではなく、マネージ オブジェクトにあると考えられます。

于 2013-02-02T16:03:46.357 に答える
2

それがあなたを助けることができるかどうかわかりませんが、数年前に同様の問題に直面したようです. 調査で他のプログラムの dll が指摘されたことを思い出すと、メモリ アクセス違反はウイルス対策 (この場合は NOD32)、ファイアウォール、またはネットワーク スニファー/トラフィック コントローラーによって引き起こされる可能性があることがわかりました。

アプリケーション ログ ([コントロール パネル] -> [システムとセキュリティ] -> [管理ツール] -> [イベント ビューア]) で、上記のアプリケーションによって発生したエラーを確認してください。問題が他のプログラムにある場合は、それを無効化/アンインストールして、プログラムにクラッシュがまだ表示されるかどうかをもう一度確認してください。

UPDクリーンなテスト環境でこの問題を再現しようとしましたか?

于 2013-01-27T13:45:33.203 に答える
1

debugdiag を使用して、マシンで AccessViolationException の原因を確認できます。プロセスのクラッシュ ルールを構成し、ダンプ ファイルとログ ファイルを調べます。そのようにして、この件に関するより多くの情報を入手していただければ幸いです。また、マシンで最新の Windows アップデート bcos を実行していることを確認してください。CLR バージョンのセキュリティ アップデートで解決された同様の問題がありました。

于 2013-01-25T14:17:36.820 に答える