エラーが表示されずにプログラムがクラッシュした場合に問題を特定するにはどうすればよいですか?
-
18-09-2019 - |
質問
アプリケーションがクラッシュして終了し、[送信しない] ボタンと [エラー レポートを送信する] ボタンを含むダイアログが表示された場合に実行する必要がある手順を教えてください。
これを解決するには、イベント ビューアを見る以外に何ができるでしょうか?
ありがとう
解決
を追加できます
try/catch/finally
あなたの周りに構築するMain()
エントリメソッドの本体。WinForms の場合は、
ThreadException
Application.Run() の直前にハンドラーを追加し、WinForms UI イベント ハンドラーでスローされた例外をキャッチします。Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
他のすべての未処理例外は、以下を使用してキャッチできます。
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
ただし、これにより許可されるのは例外のログ/報告のみであることに注意してください。この最後のハンドラーを終了すると、アプリケーションが終了するのを防ぐことはできません。
Visual Studio は次のように構成することもできます。 最初のチャンスの例外で中断する, 、外部デバッガー (マネージド SoS 拡張機能を備えた WinDbg など) も初回例外をキャッチできます (http://www.codeproject.com/KB/debug/windbg_part1.aspx).
また、log4net などのログ フレームワークを使用して、有用なログをアプリに追加し、アプリケーションが終了する前に例外情報をダンプします。
他のヒント
ユーザーを確認して下さい。あなたがエラーを再現することができた場合は、Visual Studioでのデバッグで実行するとクラッシュを引き起こすための手順に従ってください。それがエラーをキャッチどこVisual Studioがデバッグモードに入ります。あなたはスタックトレースをたどると、コードがエラーを引き起こしているものを見ることができますが形成されます。 Visual Studioは、ほとんどの時間はかなりデバッグが容易。
理想的には、このような nLog のか<のhref = "HTTPなどのロギングライブラリを使用する必要があります。 //logging.apache.org/log4net/index.html」のrel = 『nofollowをnoreferrer』> log4netのを、それらが発生あなたのコードでそれらをログインすることで、一般的には任意の未処理の例外、および例外をログに記録する。
また、それはあなたの開発マシン上で実行していないとき、あなたが問題を追跡を支援するアプリケーションでのロギングの異なるレベルを持つように助けることができます。 nLogを使用すると、本番コードでログを残すことができますし、ロギング設定ファイルを使用して/無効ログ出力を有効にします。
私はそれが同様の機能を持っている場合ので、私は知らないlog4netのを使用していませんでした。
のエラーはあなたがバックグラウンドスレッドで未処理の例外を持っている場合に発生する傾向があり、「送信しない/送信」(メインスレッドは、それが/継続スタックトレースと.NETダイアログを終了し表示されます)。
あなたのスレッドの関数に例外ハンドラを追加し、そこからログインします:
void RunMyThread()
{
try
{
// background thread code
}
catch (Exception ex)
{
// Log the exception
}
}
これは非常に単純化され、そしてあなたは、例外を処理する方法ではないかもしれません。しかし、うまくいけば、これはあなたが正しい方向に進んで取得します。
問題をデバッグするWinDBGのを使用してください。あなたは、例外がスローされたとき、それは(ブレークポイントで停止中のように)壊れ行い、その後、スタックトレースを調べることができます...スコープ内のオブジェクトなど...
、あなたはいくつかの死後のデバッグを行うことができます。私は、メモリダンプファイル(.DMP)を収集するために Userdumpをに使用したいです。それから私は、分析のためのWinDbgを使用します。