C++ アプリが Windows でクラッシュした場合、有用なデバッグ情報をサーバーに送信したいと考えています。
Linux では GNUbacktrace()
関数を使用します。Windows に相当するものはありますか?
プログラムがクラッシュした後に有用なデバッグ情報を抽出する方法はありますか? それともプロセス内からのみですか?
(「クラッシュしないようにアプリをテストする」というアドバイスは役に立ちません! - 重要なプログラムにはすべてバグがあります)
C++ アプリが Windows でクラッシュした場合、有用なデバッグ情報をサーバーに送信したいと考えています。
Linux では GNUbacktrace()
関数を使用します。Windows に相当するものはありますか?
プログラムがクラッシュした後に有用なデバッグ情報を抽出する方法はありますか? それともプロセス内からのみですか?
(「クラッシュしないようにアプリをテストする」というアドバイスは役に立ちません! - 重要なプログラムにはすべてバグがあります)
関数Stackwalk64を使用して、Windows でスタック トレースをスナップできます。
この関数を使用する場合は、必ず FPO を無効にしてコードをコンパイルする必要があります。シンボルがないと、StackWalk64 は FPO が適用されたフレームを適切に処理できません。
__try/__except
SetUnhandledExceptionFilter を呼び出すことにより、最上位ブロックを介してクラッシュ時にプロセスで実行されているコードを取得できます。クラッシュしたプロセス内でコードを実行する必要があるため、これは少し信頼できません。または、組み込みの Windows エラー報告だけでクラッシュ データを収集することもできます。これは、侵害されてクラッシュしたプロセス内で実行されるコードを追加する必要がないため、より信頼性が高くなります。唯一のコストは、署名済みのバイナリをサービスに送信する必要があるため、コード署名証明書を取得することです。 https://sysdev.microsoft.com/en-US/Hardware/signup/に詳細があります。
独自のコードを作成する場合は、Windows API 呼び出しのMiniDumpWriteDumpを使用できます。Windows XP と Vist はどちらもこのプロセスを自動化し、https://winqual.microsoft.comでサインアップしてエラー レポートにアクセスできます。
また、http ://kb.mozillazine.org/Breakpadおよびhttp://www.codeproject.com/KB/debug/crash_report.aspxで他の解決策を確認してください。
現在のスタックフレーム アドレスをログ ファイルにダンプするのは非常に簡単です。あなたがしなければならないことは、プログラムの障害 (つまり、Windows の割り込みハンドラー) またはアサートで呼び出されるそのような関数を取得することだけです。これは、リリースされたバージョンでも実行できます。次に、ログ ファイルをマップ ファイルと照合すると、関数名を含むコール スタックが生成されます。
これについては、数年前に記事を公開しました。
C++/WTL アプリケーションでクラッシュを処理する方法について説明します。
まず、メイン関数で_set_se_translatorを呼び出し、構造化ウィンドウ例外を使用する代わりに C++ 例外をスローする関数を渡します。この関数は、 FormatMessageを介して Windows エラー メッセージを取得できるエラー コードと、ミニダンプ ( code here )を書き込むために使用できる PEXCEPTION_POINTERS 引数を取得します。また、EXCEPTION_NONCONTINUABLE_EXCEPTION や EXCEPTION_STACK_OVERFLOW など、回避する必要がある特定の「メルトダウン」エラーの例外コードを確認することもできます :) (回復可能な場合は、このミニダンプ ファイルをメールで送信するようにユーザーに求めます。)
ミニダンプ ファイル自体は、通常のプロジェクトのように Visual Studio で開くことができます。実行可能ファイルの .pdb ファイルを作成していれば、プロジェクトを実行すると、クラッシュの正確な場所にジャンプします。デバッガーから調べることができる呼び出しスタックとレジスター。
この Web サイトには、C++ 例外後の Win32 でのスタック取得の詳細な概要が記載されています。
http://www.eptacom.net/pubblicazioni/pub_eng/except.html
もちろん、これはプロセス内からのみ機能するため、プロセスが終了するか、そのコードが実行される前に終了するポイントまでクラッシュした場合、機能しません。
ミニダンプ ファイルを生成します。その後、または Visual Studio にロードしてwindbg
、クラッシュが発生したスタック全体を調べることができます。
ここから読み始めるのが良いでしょう。
ランタイム クラッシュのコールスタック (およびその他の有益な情報) を取得したい場合は、リリース ビルドをオンサイトで実行する必要があります(DrWtsn32.exe を実行して)ワトソン博士をセットアップする必要があります。「クラッシュ ダンプを生成する」オプションをオンにすると、アプリがクラッシュしたときに、指定されたパス (user.dmp と呼ばれる) にミニ ダンプ ファイルが書き込まれます。
これを取得して、サーバーを構築したときに作成したシンボルと組み合わせることができます (コンパイラ/リンカーでこれを設定して、pdb ファイルを生成します。これらを自宅で安全に保管し、それらを使用してダンプを照合し、ソースを解決できるようにします。クラッシュが発生した場所)
自分でwindbgを取得して開き、メニュー オプションを使用して「クラッシュ ダンプをロード」します。すべてがロードされたら、「~#kp」と入力して、すべてのスレッドのコールスタックを取得できます (または、現在のスレッドの上部にあるボタンをクリックします)。
ウェブ上でこれを行う方法を知るための良い記事があります。これは私のお気に入りです。これを読んで、自分でシンボルを簡単に管理する方法を理解することをお勧めします。
アプリケーションでダンプ生成フレームワークを設定する必要があります。その方法は次のとおりです。
次に、windbg などのダンプ アナライザーを使用してさらに分析するために、ダンプ ファイルをサーバーにアップロードできます。
adplus を使用してクラッシュ コールスタックをキャプチャすることもできます。
Windows 用のデバッグ ツールをダウンロードしてインストールできます。
adplus の使用法については、ここに記載されています: Adplus の使用法
これにより、完全なクラッシュまたはハング ダンプが作成されます。ダンプを取得したら、Windbg が助けに来ます。正しい pdb とシンボルをマップすると、ダンプを分析する準備が整います。まず、コマンド「!analyze -v」を使用します