9

MiniDumpWriteDump を介してアプリケーションの実行中に記録されたミニダンプがたくさんあります。ミニダンプは、開発マシンとは異なる OS バージョンのマシンで作成されました。

現在、dbghelp.dll を使用して、ミニダンプからスタック トレースを抽出するプログラムを作成しようとしています。MINIDUMP_MODULE_LIST を調べて SymLoadModule64 を呼び出していますが、パブリック シンボル サーバーから pdb (kernel32 など) をダウンロードできません。「C:\Windows\System32」をシンボル パスに追加すると、dll が検出され、シンボルがダウンロードされますが、もちろんミニダンプの dll と一致しないため、結果は役に立ちません。

では、適切な pdb をダウンロードして使用するように dbghelp.dll に指示するにはどうすればよいでしょうか。

[編集]

SymLoadModule64 はファイル名のみを取得し、バージョン/チェックサム情報を取得しないことを忘れていたため、明らかに SymLoadModule64 だけでは、dbghelp がどの pdb をダウンロードするかを判断できません。

この情報は、MINIDUMP_MODULE_LIST で実際に入手できますが、dbghelp API に戻す方法がわかりません。

追加のパラメーターを取る SymLoadModuleEx がありますが、それが必要なのか、追加のパラメーターに何を渡す必要があるのか​​ わかりません。

[編集]

デバッグ用 SDK には dbghelp.dll と一緒に dbgeng.dll が配布されていることに気付きましたが、今のところうまくいきません。MSDN は十分に文書化されているようで、windbg が使用するエンジンと同じであると述べています。たぶん、それを使用してスタック トレースを抽出できます。

MSDN には個々のコンポーネントのみが記載されており、それらがどのように連携するかは記載されていないため、dbgeng.dll を使用してミニダンプを処理するための紹介を誰かに教えてもらえれば、おそらく役立つでしょう。

4

2 に答える 2

8

他の誰かがダンプからのスタック トレースの抽出を自動化したい場合に備えて、私が最終的に行ったことは次のとおりです。

アップデートで述べたように、dbghelp.dll の代わりに dbgeng.dll を使用できます。これは、WinDbg が使用するエンジンと同じようです。いくつかの試行錯誤の後、WinDbg と同じシンボル読み込みメカニズムで適切なスタック トレースを取得する方法を次に示します。

  • DebugCreate を呼び出してデバッグ エンジンのインスタンスを取得する
  • IDebugClient4、IDebugControl4、IDebugSymbols3 のクエリ
  • IDebugSymbols3.SetSymbolOptions を使用して、シンボルの読み込み方法を構成します ( WinDbg が使用するオプションについては、MSDNを参照してください)。
  • WinDbg で行うように、IDebugSymbols3.SetSymbolPath を使用してシンボル パスを設定します。
  • IDebugClient4.OpenDumpFileWide を使用してダンプを開きます
  • IDebugControl4.WaitForEvent を使用して、ダンプが読み込まれるまで待機します。
  • IDebugSymbols3.SetScopeFromStoredEvent を使用して、ダンプに保存されている例外を選択します
  • IDebugControl4.GetStackTrace を使用して、最後のいくつかのスタック フレームを取得します
  • IDebugClient4.SetOutputCallbacks を使用して、デコードされたスタック トレースを受け取るリスナーを登録します。
  • IDebugControl4.OutputStackTrace を使用してスタック フレームを処理する
  • IDebugClient4.SetOutputCallbacks を使用して、コールバックの登録を解除します。
  • インターフェイスを解放する

WaitForEvent の呼び出しは重要と思われます。これがないと、次の呼び出しでスタック トレースの抽出に失敗するからです。

また、まだメモリ リークがあるようです。適切にクリーンアップしていないのか、dbgeng.dll の内部にあるのかはわかりませんが、20 個のダンプごとにプロセスを再起動することができるので、調査しませんでした。もっと。

于 2011-11-14T09:14:19.950 に答える