web-dev-qa-db-ja.com

WinDbgシンボル解決

WinDbgを使用する場合、プライベートシンボルファイル(pdb?)はどこに配置する必要がありますか?

私の状況は次のとおりです。DLLデバッグしたい。このDLLのソースコードとシンボルファイルがあります。このDLLは別のDLL(これにはシンボルもソースもありません))、これはEXEによって呼び出されます(これにもシンボルもソースもありません)。

私の問題は、次のような警告が表示されることです

***警告:C:\ TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dllのチェックサムを確認できません

この警告が、コールスタックで次のタイプのメッセージを受け取る理由です。

MyDll!AClass :: AFunction + SomeHexAddress

私のファイル構造は次のようになります。

Exe:C:\ TheProgram\program.exe

呼び出し元のdll:C\TheProgram\SomeSubfolder\caller。???

My DLLデバッグしたい:C:\ TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll

注:シンボルファイルパスとソースファイルパスをdebug DLLが生成された場所、exeとは異なるドライブのワークスペースで)に設定します。しかし、pdb +マップファイルをコピーしましたそして、デバッグしたいdllにそれを置きます。

34
krebstar

返事が遅れて申し訳ありません。
投稿の中で、次のエラーメッセージが表示されていることに言及しています。

*** WARNING: Unable to verify checksum for C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll

また、「DLLシンボルパスのシンボルをどこに配置しますか?」

最初の問題に対する応答を次に示します:

不一致のシンボルを識別する手順。

  1. うるさい
  2. .reload
  3. x MyDll!*クラス*
    *これはdllを再読み込みします。代わりに、kbと入力してDLLの呼び出しスタックも表示します。
  4. !sym quiet
    *元の静かなシンボルの読み込みにリセットします

また、実行することができます

0:001> lmv m myDll  *(and examine the Checksum)

注:チェックサムがある場合、WindbgはDLLのチェックサムをPDBのチェックサムと一致させることができます。すべての開発環境では、チェックサムを生成する方法が異なります。

ここに、PDBの配置場所に関する質問に対する回答があります

MyDll.pdbをシンボルストアに追加した場合、次の構文を使用できます。

.sympath SRV*c:\symcache*http://msdl.Microsoft.com/download/symbols 

ロジャーが上で示唆したように...

ただし、PDBをローカルに持っている場合は、PDBへのパスを最初に配置してから、このようにシンボルサーバーに移動することをお勧めします。

.sympath C:\TheProgram\SomeSubfolder\AnotherSubfolder\;SRV*c:\symcache*http://msdl.Microsoft.com/download/symbols

このように、Windbgは、Symbols Serverキャッシュを使用する前に、SomSubFolder dirに対してローカルに見える必要があります。

ありがとう、アーロン

46
AaronBa

デバッガにそれらがどこにあるかを伝えることができれば、プライベートシンボルファイルをどこに置いてもかまいません。

表示されている警告 ではない スタックトレースには影響がありますが、caller.DLLおよびapp.EXEのシンボルが欠落しているという事実 する

Windbgでのシンボルの構成(ローカル)は、次のように簡単です。

.sympath [+] path_to_pdbs
*そして
。symfix + path_to_system_pdb_store

あなたが見ている:

MyDll!AClass :: AFunction + SomeHexAddress

さて、私の質問は、あなたが立ち往生している問題は何ですか?

追伸windbgでは.mapファイルは必要ありません。

4
deemok

ビルドプロセスの一環として、プライベートPDBファイルとリリースされたEXE/DLLファイルをシンボルサーバーにコピーします。最も単純な場合、これは単なるUNCパスですが、HTTPを使用したアクセス用に構成できます。

出力ファイルをコピーするには、SYMSTORE.EXEプログラムを使用します。

次に、デバッガーを構成して(Visual StudioとWinDbgを使用)、そのパスを確認します。 WinDbgの場合、これを行う最も簡単な方法は、環境変数を設定することです。

__NT_SYMBOL_PATH=
    SRV*C:\WebSymbols*http://msdl.Microsoft.com/download/symbols;
    \\symsvr\Symbols
_

(それはすべて1行である必要があります)

これにより、WinDbgがMicrosoft Symbol Server(C:\ WebSymbolsのファイルをキャッシュする)を検索し、ローカルシンボルストア(_\\symsvr\Symbols_)を検索するように構成されます。

また、Source Serverツールを使用してSVNの詳細をPDBファイルに保存します。つまり、特定のリリースのビルドに使用した正確なソースファイルに戻ることができます。 ...\Debugging Tools for Windows (x86)\srcsrvを見てください。

3
Roger Lipscombe

1つのオプションは、シンボルファイルを(ieビルド出力フォルダー)のままにして、-y WinDbgを使用することです。これらのファイルを見つけるコマンドラインオプション。このアプローチを使用すると、シンボルファイルが常に最新のものになることが保証されます。

Microsoftヘルプから:

-y SymbolPath 
Specifies the symbol search path. Separate multiple paths with a 
semicolon (;). If the path contains spaces, it should be enclosed 
in quotation marks. For details, and for other ways to change this 
path, see Symbol Path. 
2
jussij