Visual Studio デバッガーを接続して保存できる場合と同じように、(Windows OS で) アプリケーションのクラッシュ時にクラッシュ ダンプ ファイルを自動的に作成する方法はありますか? つまり、自動的に作成されたクラッシュ ダンプ ファイルを使用して、Visual Studio でアプリケーションをデバッグできるようにしたいと考えています。
2 に答える
更新: Debug Diag 2.0が利用可能になりました。このリリースでは、.NET ダンプがネイティブでサポートされています。
はい、DebugDiag 1.2を使用して可能です。
デバッグ診断ツール (DebugDiag) は、ハング、パフォーマンスの低下、メモリ リークや断片化、ユーザー モード プロセスでのクラッシュなどの問題のトラブルシューティングを支援するように設計されています。このツールには、インターネット インフォメーション サービス (IIS) アプリケーション、Web データ アクセス コンポーネント、COM+、および関連する Microsoft テクノロジに重点を置いた追加のデバッグ スクリプトが含まれています。
ダンプに対してクラッシュ/ハング分析を実行し、スリープ状態にあるコールスタックとスレッドに関する優れたレポートを提供することもできます (ハング ダンプの場合)。また、フライダンプを取ることもできます。DebugDiag によって取得されたダンプは、DebugDiag、Visual Studio、および WinDbg で分析できます。
編集: DebugDiag の使用方法への MSDN リンクはこちらです。
SetUnhandledExceptionFilter
例外をキャッチするために使用します。このグローバル例外ハンドラーでは、MiniDumpWriteDump
関数を使用してダンプ ファイルを作成します。
すべての例外 (STL からの例外、純粋仮想関数、abort
C ランタイム呼び出しなど) をキャッチすることはできないなど、この方法での例外処理には多くのことがあります。また、複数のスレッドが何らかの例外を引き起こす場合、問題が発生する可能性があります。グローバル例外ハンドラーで例外が発生した場合は、実行中の他のすべてのスレッドを一時停止するか、他のスレッドがダンプ生成コードに干渉しないように何らかのロジックを使用する必要があります。
/EHsc
すべてのケースを処理するには、リンカ設定 (フラグなど) を調整する必要があります。これにより、すべての例外が で処理されtry-catch
、リリース ビルドでもデバッグ情報が有効になり、.PDB が生成され、コール スタックを取得できるようになります。API フックを使用して、C ランタイム呼び出しがグローバル例外ハンドラーとロットを無効にしないようにします。
これらを参照してください。
私の唯一の推奨事項は、より単純なアプローチから始めて、より複雑なシナリオについて気にしないことです。要するに、SetUnhandledExceptionFilter
シングル スレッド アプリケーションで を使用するとアクセス違反が発生し、グローバル例外ハンドラでMinidumpWriteDump
MINI ダンプを作成するために使用します (つまり、メモリ ダンプを使用しません)。