2011-07-06 20 views
7

私はMiniDumpWriteDumpを通してアプリケーションのランタイム中に記録されたミニダンプをたくさん持っています。ミニダンプは、自分の開発マシンとは異なるOSバージョンのマシンで作成されました。ミニダンプからスタックトレースを抽出する方法は?

今、dbghelp.dllを使用して、ミニダンプからスタックトレースを抽出するプログラムを作成しようとしています。私はMINIDUMP_MODULE_LISTを歩いてSymLoadModule64を呼び出していますが、これはパブリックシンボルサーバからpdbs(kernel32など)をダウンロードできません。 "C:\ Windows \ System32"をシンボルパスに追加すると、dllが見つかってシンボルがダウンロードされますが、ミニダンプのdllと一致しないので、結果は役に立たなくなります。

どのようにdbghelp.dllに適切なpdbsをダウンロードして使用するように指示しますか?

[編集]

私はSymLoadModule64のみだけではSymLoadModule64でそう明らかに、ファイル名となしバージョン/チェックサム情報を受け取りdbghelpがダウンロードしたPDB把握することは不可能だと述べているのを忘れていました。

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

追加のパラメータが必要なSymLoadModuleExがありますが、それが私が必要とするものか追加のパラメータのために渡すべきものがあるかどうかはわかりません。

[編集]

ありません運これまでのところ、そこものデバッグSDKでdbghelp.dllと一緒に配布さdbgeng.dll私が気づいたのに。 MSDNはかなりよく書かれていて、windbgが使うものと同じエンジンだと言います。たぶん私はそれを使用してスタックトレースを抽出することができます。

MSDNには個々のコンポーネントのみがドキュメント化されていて、どのように連携しているかはわからないので、dbgeng.dllを使用してミニダンプを処理する方法については、私はそれが代わりにdbghelp.dllのdbgeng.dll使用することが可能です更新で述べたように思えるれ、

+0

あなたはおそらくあなたもミニダンプをミニにしました。 DumpType引数を持つTinker。 Debug + Windows + Modulesリストに正確なDLLパス、バージョン、タイムスタンプが表示されていることを確認してください。 –

+0

いいえ、それは問題ではありません、私はWinDbgでミニダンプをロードでき、PDBを正しくダウンロードできます。 WinDbgでダンプを手動で調べるのではなく、スタックの検索を自動化したいのです。 – Zarat

+1

ハックルートに行きたい場合は、コマンドをntsdに渡して出力をキャプチャするだけで済みます。 –

答えて

8

は、念のために誰にもここで私がやってしまったものだ、ダンプからスタックトレースを抽出する自動化したいですWinDbgが使用するのと同じエンジンにする。いくつかの試行錯誤の後、WinDbgと同じシンボル読み込み機構を使って良いスタックトレースを得る方法があります。

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

WaitForEventの呼び出しが重要であるように見えるのは、次の呼び出しでスタックトレースを抽出できないためです。

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

0

複数のミニダンプファイルの分析を自動化する簡単な方法は、記事"Automating Analyzing Tons Of Minidump Files With WinDBG And PowerShell"でJohn Robbinsが作成したスクリプトを使用することです(code on GitHubを取得できます)。

これは、デフォルトの設定では十分でない場合、どのようなWinDbgコマンドでも実行できるように微調整するのは簡単です。

関連する問題