クラッシュからデバッグ情報を抽出する方法
-
21-08-2019 - |
質問
C++ アプリが Windows 上でクラッシュした場合、有用なデバッグ情報をサーバーに送信したいと考えています。
Linux では GNU を使用します backtrace()
関数 - Windows に相当する関数はありますか?
プログラムがクラッシュした後に有用なデバッグ情報を抽出する方法はありますか?それともプロセス内からのみですか?
(「アプリがクラッシュしないようにテストする」といったアドバイスは役に立ちません。- 重要なプログラムには必ずバグがあります)
解決
関数 Stackwalk64 のスタックトレースをスナップするために使用することができますWindows上でます。
あなたはこの機能を使用する場合は、、あなたは無効FPOを使用してコードをコンパイルすることを確認する必要があります - 。記号なし、StackWalk64が正しくFPO'dフレームを歩くことができなくなります。
あなたはSetUnhandledExceptionFilterを呼び出して、トップレベルの__try/__except
ブロックを経由してクラッシュ時にプロセス内で実行されているいくつかのコードを取得することができます。それがクラッシュしたプロセス内で実行されているコードを持っているあなたを必要とするので、これは少し信頼できないです。
また、あなただけの組み込みのWindowsエラー報告は、クラッシュデータを収集することができます。それは妥協の内部で実行中のコードを追加する必要はありませんので、これは、より信頼性のある、プロセスをクラッシュしました。唯一のコストは、あなたがサービスに署名したバイナリを提出しなければならないので、コード署名証明書を取得することです。 https://sysdev.microsoft.com/en-US/Hardware/signup/ >詳細を持っています。
他のヒント
Windows API呼び出しを使用できます ミニダンプ書き込みダンプ 独自のコードをロールしたい場合。Windows XP と Vist はどちらもこのプロセスを自動化しており、次の場所でサインアップできます。 https://winqual.microsoft.com エラーレポートにアクセスできるようになります。
こちらもチェックしてください http://kb.mozillazine.org/Breakpad そして http://www.codeproject.com/KB/debug/crash_report.aspx 他のソリューションについては。
このウェブサイトは、C ++例外の後のWin32上のスタック検索のかなり詳細な概要を提供します:
http://www.eptacom.net/pubblicazioni/pub_eng/except.html の
プロセスが終了するか、そのコードが実行される前に、それは動作しません終了時点までクラッシュしてしまった場合、もちろん、これが唯一のプロセス内から動作し、そうなります。
ミニダンプファイルを生成します。その後、windbg
またはVisual Studioでそれをロードし、クラッシュが発生したスタック全体を検査することができます。
そのログファイルに現在のスタックフレームのアドレスをダンプするのは非常にシンプル。あなたがしなければならないのは、プログラムの障害に呼び出され、このような機能(Windowsの場合、すなわち割り込みハンドラ)を取得する場合、または主張します。これは、同様にリリースされたバージョンで行うことができます。ログファイルには、関数名とコールスタックに結果のマップファイルと一致することができます。
私は何年か前にこの記事を公開しました。
C++/WTL アプリケーションでクラッシュを処理する方法について説明します。
まず、main 関数で次のように呼び出します。 _set_se_translator, 、構造化 Windows 例外を使用する代わりに C++ 例外をスローする関数を渡します。この関数はエラー コードを取得します。このコードについては、次の方法で Windows エラー メッセージを取得できます。 フォーマットメッセージ, 、およびミニダンプを作成するために使用できる PEXCEPTION_POINTERS 引数 (コードはここにあります)。EXCEPTION_NONCONTINUABLE_EXCEPTION や EXCEPTION_STACK_OVERFLOW など、救済すべき特定の「メルトダウン」エラーの例外コードをチェックすることもできます:) (回復可能な場合は、このミニダンプ ファイルを電子メールで送信するようユーザーに求めます。)
ミニダンプ ファイル自体は、通常のプロジェクトと同様に Visual Studio で開くことができ、実行可能ファイルの .pdb ファイルを作成していれば、プロジェクトを実行すると、クラッシュの正確な場所にジャンプします。呼び出しスタックとレジスター。デバッガーから調べることができます。
ランタイム クラッシュのコールスタック (およびその他の有益な情報) をサイト上であってもリリース ビルドで取得したい場合は、次のように設定する必要があります。 ワトソン博士 (DrWtsn32.exe を実行します)。「クラッシュ ダンプを生成する」オプションをオンにすると、アプリがクラッシュしたときに、指定されたパス (user.dmp と呼ばれる) にミニ ダンプ ファイルが書き込まれます。
これを取得し、サーバーを構築したときに作成したシンボルと組み合わせることができます (これをコンパイラー/リンカーに設定して、pdb ファイルを生成します。これらを自宅に安全に保管し、ソースを解決できるようにダンプと照合するために使用します)衝突が起きた場所)
自分自身を手に入れましょう ウィンドバック, 、それを開き、メニューオプションを使用して「クラッシュダンプをロード」します。すべてがロードされたら、「~#kp」と入力してすべてのスレッドのコールスタックを取得できます (または、現在のスレッドの上部にあるボタンをクリックします)。
これを行う方法を知るための優れた記事がウェブ上にあります。 これです 私のお気に入りです、あなたもそう思うでしょう これを読む シンボルを自分で簡単に管理する方法を理解するために。
アプリケーションでダンプ生成フレームワークをセットアップする必要があります。 ここ それを行う方法です。
その後、windbg などのダンプ アナライザーを使用してさらに分析するために、ダンプ ファイルをサーバーにアップロードできます。
あなたがクラッシュコールスタックをキャプチャするためにADPlusを使用したい場合があります。
あなたは、Windows用デバッグツールをダウンロードしてインストールすることができます。
ADPlusのの使用法がここで言及されています。
の ADPlusの使用状況これは完全なクラッシュを作成するか、ダンプを掛けます。あなたはダンプを持っていたら、Windbgのは救助に来ます。正しいPDBSや記号をマップし、あなたはすべてのダンプを分析するように設定されています。使用してコマンドを起動するには、
「!-v分析」