24

私は MinGW でコンパイルされた C++ アプリケーションを持っていますが、それに対して顧客からクラッシュの苦情が寄せられています。そのため、(新しいバージョンをリリースする前に) クラッシュする可能性のある部分を頻繁に記録することに加えて、エラーが発生したときにスタック トレースやその他の有用なデバッグ情報を見つけるのに役立つクラッシュ レポーターを探していました。

MinGW アプリケーションと互換性のあるツールはありますか? (当時のコンパイラとクラッシュレポート戦略の間には密接な関係があるようです。したがって、質問です)。

役立つ Windows ツールはありますか? アプリケーションは、主に Windows XP マシンで実行されています。

ファイルに情報を書き込むことができれば、私の目的には十分です。その後、顧客に情報を郵送してもらうよう依頼できます。

私はgoogle-breakpadSetUnhandledExceptionFilterを調べてきましたが、それらが何らかの形で役立つかどうかはまだわかりません。crashrptなどの他のクラッシュ レポート ユーティリティは、Visual C++ 用に設計されているため、MinGW でそれらを試してもあまり意味がないと思います。

編集:件名に関するいくつかの便利なリンク

4

1 に答える 1

15

実際、問題はクラッシュ レポートを機能させることではありません。これは、DbgHelp ライブラリ関数を使用する場合は些細なことであり、最も顕著に現れますMiniDumpWriteDump。ただし、古いシステムで DbgHelp ライブラリを再配布し、呼び出す関数のバージョン要件を確認することを忘れないでください。新しいバージョンの Windows には、少なくともこのライブラリのいくつかのバージョンが付属しています。

MS 以外のコンパイラを使用する際の問題 (問題は Embarcadero、以前の Borland、製品、または Watcom にも存在します) は、作成されたデバッグ シンボルが、デバッグ標準機能である DbgHelp ライブラリに対して意味をなさないことです。 Windows で。PDB 形式は大部分が文書化されておらず (いくつかの手がかりについては、 Sven Schreiber PDBという用語を検索してください)、それらを作成するために使用されるライブラリは、DbgHelp ライブラリと同じ意味で「パブリック」ではありません - 後者は読み取り/解析にのみ使用できます作成されたデバッグ シンボル。これらは Visual Studio 製品の一部であり、通常は mspdbXY.dll (XY は 10 進数) のような名前が付いています。

したがって、バグ レポートを作成する場合は、「コンパイラの問題」に集中するのではなく、デバッガの問題に集中することを強くお勧めします。一般的な方向は次のとおりです。

  1. 特定のデバッグ形式を理解するデバッガーを使用します (MinGW、IIRC の DWARF 用 GDB)。
  2. 複数のフォーマットを理解するデバッガーを使用してください (IDA が頭に浮かび、他の利点もあります ;))
  3. デバッグ シンボル (DWARF) またはより一般的.mapなファイルを理解するために、WinDbg などに拡張機能を記述します (このような拡張機能は、数年前に Borland.mapファイル用に作成されたことを認識しています) 。
  4. アセンブリ言語を学び、利用可能なツール (WinDbg またはより一般的には DbgHelp ライブラリ)をシンボルなしで使用します (おそらく、既に理解していない限り、学習曲線が急すぎるでしょう)。

4 の拡張機能として、.Sコンパイル中に GCC に (アセンブリ) ファイルを作成させて、シンボル サポートなしで作業しているときにソース コードとクラッシュ ダンプを相互参照することもできます。

私は unixoid プラットフォームでは GDB を好みますが、Windows では WinDbg やその他のデバッガーを好むため、MiniDumpWriteDumpWindows の GDB で実際のクラッシュ ダンプ形式 (で作成)がサポートされているかどうかはわかりません。この場合、GDB によって期待されます。

ところで: Windows XP 以降を使用していて、その事実を信頼できる場合は、AddVectoredExceptionHandler代わりに使用SetUnhandledExceptionFilterして、クラッシュ ダンプの書き込みを準備してください。

于 2011-03-08T02:17:31.230 に答える