1. ホーム
  2. debugging

[解決済み] WinDbgでシンボルを設定する方法は?

2022-02-14 08:13:08

質問事項

を使っています。 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でシンボルを見つけるにはどのように設定すればよいですか?

<サブ 免責事項: この質問は、すべての 間違ったシンボル の投稿は ウィンドブレーカー .

解決方法は?

シンボルは、さまざまな方法で正しく設定することができます。

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

80%のケースに対応するTLDRバージョン

新しいフォルダーを作成する c:\symbols マイクロソフトから提供されたシンボルのために。そして、次のように入力します。

.symfix+ c:\symbols
.reload

(または reload -f 必要であれば)

マイクロソフトのサーバーに接続し、そこからシンボルをダウンロードするため、インターネットに接続されていることを確認してください。

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

個々のシンボルが正しいかどうかをチェックするために symchk というツールがWinDbgに付属しています。

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を使用します。 (本来は ここにリダイレクト が、現在リダイレクトが壊れています)

Windowsデバッガ用シンボルパス