実行時に myApp.exe がクラッシュすると、「未処理の Win32 例外」が表示されますが、どの例外が発生したかをどのように知ることができますか? どこで何かがうまくいかなかったのですか?
4 に答える
ネイティブ C++ アプリについては、私の以前の回答を参照してください: Windows でコア ダンプ (ソフトウェアがクラッシュしたとき) を検出/リダイレクトして、ハンドルされていない例外をキャッチします (後でクラッシュを分析するために使用できるクラッシュ ダンプを作成するためのコードも提供します)。クラッシュは開発システムで発生し、次にVisual Studioで発生しています(他のIDEに同様のものがない場合は、それを使用していると思います)、デバッグ/例外で「Win32例外」の「スロー」ボックスにチェックマークを付けます。
通常、Windows はいくつかの 16 進数も表示します。例外コードは0xC0000005
. これはアクセス違反のコードです。その場合、違反しているアドレス、違反しているアドレス、違反の種類 (読み取り、書き込み、または実行) の 3 つの追加情報も得られます。
Windows はそれ以上絞り込むことはありません。たとえば、プログラムで配列の末尾を通り過ぎても、Windows は配列を繰り返し処理していることさえ認識しない可能性があります。「read:OK、read:OK、read:out of bounds => page fault => ACCESS VIOLATION」と表示されるだけです。違反しているアドレス (配列反復コード) と違反しているアドレス (配列の背後にある範囲外のアドレス) からそれを把握する必要があります。
.Net アプリの場合は、イベントのハンドラーを入れることができますUnhandledException
。詳細とサンプル コードについては、こちらを参照してください。
ただし、一般的には、例外処理が壊れていることを示す良い兆候であるため、コードを調べて、スローされる可能性があるが例外を処理しない場所を見つける価値があるかもしれません。
デバッガを使用します。プログラムを実行して、アプリケーションを強制終了する例外がスローされたことを確認できます。投げた場所を特定できるかもしれません。これにはVSデバッガーを使用していませんが、gdbではcatch throw
、例外がスローされたときにブレークポイントを強制するために使用できます。似たようなものがあるはずです。