web-dev-qa-db-ja.com

WinDbgでシンボルを設定する方法は?

Windows用デバッグツール を使用しています。WinDbg/ cdbまたはntsdを起動すると、次のエラーメッセージが表示されます。

Symbol search path is: *** Invalid ***
****************************************************************************
* Symbol loading may be unreliable without a symbol search path.           *
* Use .symfix to have the debugger choose a symbol path.                   *
* After setting your symbol path, use .reload to refresh symbol locations. *
****************************************************************************

任意のコマンドを実行すると、エラーメッセージも表示されます

*** ERROR: Module load completed but symbols could not be loaded for <module>.<ext>

そして、以下は関連しているようです:

*********************************************************************
* Symbols can not be loaded because symbol path is not initialized. *
*                                                                   *
* The Symbol Path can be set by:                                    *
* using the _NT_SYMBOL_PATH environment variable.                   *
* using the -y <symbol_path> argument when starting the debugger.   *
* using .sympath and .sympath+                                      *
*********************************************************************

!analyze -vでも見ました

DEFAULT_BUCKET_ID:  WRONG_SYMBOLS

そして

*************************************************************************
***                                                                   ***
*** Either you specified an unqualified symbol, or your debugger      ***
*** doesn't have full symbol information. Unqualified symbol          ***
*** resolution is turned off by default. Please either specify a      ***
*** fully qualified symbol module!symbolname, or enable resolution    ***
*** of unqualified symbols by typing ".symopt- 100". Note that        ***
*** enabling unqualified symbol resolution with network symbol        ***
*** server shares in the symbol path may cause the debugger to        ***
*** appear to hang for long periods of time when an incorrect         ***
*** symbol name is typed or the network symbol server is down.        ***
***                                                                   ***
*** For some commands to work properly, your symbol path              ***
*** must point to .pdb files that have full type information.         ***
***                                                                   ***
*** Certain .pdb files (such as the public OS symbols) do not         ***
*** contain the required information. Contact the group that          ***
*** provided you with these symbols if you need this command to       ***
*** work.                                                             ***
***                                                                   ***
*************************************************************************

WinDbgを設定してシンボルを見つけるにはどうすればよいですか?

免責事項:これは、 windbg のすべての間違ったシンボル投稿に対する正規の質問であることを意図しています。

34
Thomas Weller

シンボルはさまざまな方法で正しくセットアップできます。

警告:ここの例では\\server\symbolsを使用します。これは通常、利用できないネットワークストレージです。ローカルサーバーに適合させるか、お持ちでない場合はその部分を完全に省いてください。存在しないサーバーは遅延などを引き起こす可能性があります。

ケースの80%のTLDRバージョン

Microsoftが提供するシンボル用に新しいフォルダーc:\symbolsを作成します。次に入力

.symfix+ c:\symbols
.reload

(または必要に応じてreload -f

インターネットに接続していることを確認してください。これにより、Microsoftサーバーに接続し、そこからシンボルをダウンロードします。

ケースの80%以上で、これはすでにシンボルの問題を解決している可能性があります。そうでない場合は、読み進めてください。

コマンドによるシンボルの修正

WinDbgは、シンボルパスに表示される順序でシンボルを検索します。したがって、ローカルシンボルを最初に配置し、次に会社のローカルネットワーク共有を配置してから、インターネットからシンボルをダウンロードし、コピーをローカルに保存することをお勧めします。

.sympath c:\mysymbols ; *** Symbols of your application, locally, flat list of PDB files
.sympath+ cache*c:\symbolcache ; *** (optional) Create a cache for everything
.sympath+ \\server\symbols ; *** Symbols provided from a network share
.symfix+ c:\symbols ; *** Microsoft symbols

メニューによるシンボルの修正

WinDbg(コマンドラインではない)では、File/Symbol File Path...を押すか、または Ctrl+S。次の形式で入力します

c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.Microsoft.com/download/symbols

コマンドラインによるシンボルの修正

WinDbgは、異なるシンボルパス設定で異なるデスクトップリンクを使用する場合、-yコマンドラインスイッチも使用します。

WinDbg -y "<symbol path>"

ここには完全なパスが必要です。これは次のような形式です

c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.Microsoft.com/download/symbols

環境変数によるシンボルの修正

_NT_SYMBOL_PATHという環境変数があり、シンボルパスにも設定できます。次の構文を使用します。

c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.Microsoft.com/download/symbols

WinDbgがこの変数を評価するだけでなく、Visual Studio、Process Explorer、Process Monitor、その他のソフトウェアも評価することに注意してください。この環境変数を設定すると、パフォーマンスに影響が出る場合があります。

ワークスペースの一部としてシンボルパスを保存する

複数のパスを含むかなり複雑なシンボルセットアップがある場合は、 WinDbgワークスペースの概念 に精通してください。

ワークスペースを使用すると、シンボルパスを保存できるため、すべてのデバッグセッションですべてのコマンドを再入力する必要がありません。

ワークスペースに満足したら、WinDbgのリンクを作成して-Qを含めます。これは、「迷惑な「ワークスペースを保存しますか?」という質問を抑制します」という意味です。

これまでのところ、Baseワークスペースの一部としてシンボルを保存できたことを非常に嬉しく思います。

遅延シンボル

遅延シンボル(lmコマンド中にそのように示される)は問題ではありません。 WinDbgは必要なときにそれらをロードします。すべてを強制的にロードするには、次を入力します

ld*

シンボルの問題のデバッグ

シンボル(PDB)が期待どおりに機能しない場合は、

!sym noisy

シンボルを解決するときにWinDbgが正確に実行していることに関する詳細情報を取得する。

解決策が見つかったら、それをオフにします

!sym quiet

個々のシンボルの正確性を確認するには、WinDbgに付属のsymchkツールを使用できます。

Symchk /if <exe> /s <symbol path> /av /od /pf
/if = input is a file
/s  = symbol file path
/od = all details
/av = verify
/pf = check if private symbols are available

または ChkMatch を取得します。これは少し使いやすいです

ChkMatch -c <exe file> <pdb file>

ネットワーク共有からシンボルにアクセスできない場合は、事前にネットワーク共有にログオンしてください。 AFAIR、WinDbgは資格情報を要求しません。

公式文書

Microsoft Symbol Serverを使用してデバッグシンボルファイルを取得 (should redirect here しかし、リダイレクトは現在壊れています)

Windowsデバッガーのシンボルパス

64
Thomas Weller