web-dev-qa-db-ja.com

WinDbgにアンロードされたモジュールのシンボルをロードさせる

プライベートシンボルのない.exeと.pdbしかないモジュールをデバッグしています。
デバッグセッション中に、内部構造体を検査する必要があります。明らかに、この構造体はプライベートであるためPDBには表示されませんが、幸いなことに、この構造体が定義されている.hファイルがあります。したがって、この構造体を使用するダミーモジュールを作成し、この構造体を含むPDBファイルを取得できます。

これで、構造体シンボルを含むアンロードされたモジュールができました。その構造体にメモリをキャストするために、そのシンボルをロードしたいと思います。 (もちろん、デバッグしている元の.exeをアンロードせずに)
問題:WinDbgはロードされたモジュールのシンボルのロードのみを許可しているようです...

私の質問は:アンロードされたモジュールからシンボルをロードする簡単な方法はありますか?

私はもう試した .reload /i /f MyDll.dllしかし私はいつも...MyDll.dll - unmatched
シンパスの設定は役に立ちませんでした。

何か案は?

16
Amir Gonnen

Windbgに特定のアドレスにシンボルをロードさせることができます。

0:000> .reload /f /i MyDll.dll=77777777
    c:\sym\MyDll.pdb - unmatched
0:000> lm
start             end                 module name
00000000`55555555 00000000`55555555   notepad    (no symbols)
00000000`77530000 00000000`7762a000   USER32     (deferred)
00000000`77777777 00000000`77777777   MyDll_77777777   (private pdb symbols)  c:\sym\MyDll.pdb

ここでの一致しない警告は、タイムスタンプまたはチェックサムが見つからないため、windbgがシンボルがモジュールの正しいバージョンと一致することを認識できないためです。

18
John

より良い方法は.reload /unl MyDll.dllです

アンロードされたモジュールリストには、タイムスタンプ(イメージ/ pdbマッチング用)とイメージベースアドレスが含まれています。 /unlを使用すると、WinDBGにその情報を使用するように指示します。

20
Codeguard