Table of Contents
更新日: 2025-05-14
このエントリーをはてなブックマークに追加

デバッグ シンボル

シンボルはEXEやDLLなどの実行可能ファイルを作成するときに同時に生成されるデバッグ情報です。 シンボルを格納したファイル(シンボルファイル、拡張子 .pdb)はアプリケーションを実行する際には不要ですが、関数名やソースコードのパス、行番号などデバッグで役立つ様々な情報が含まれています。 実行可能ファイルとシンボルファイルは一意の識別子で関連付けられますので、実行可能ファイルを作成したときに同時に出力されたシンボルファイルは、後のトラブルシュートに備えて保管しておく必要があります。 シンボルファイルを紛失した場合、アプリケーションのデバッグが非常に困難になるか、最悪の場合は不可能になります。 アプリケーションのリリース後にトラブルシュートするつもりが一切なければシンボルファイルを生成しないか破棄しても構わないかもしれませんが、そうでない場合は念のためシンボルファイルを生成して大切に保管しておきましょう。

シンボルの種類

シンボルは大きく分けてプライベートシンボルとパブリックシンボルの2種類があり、含まれている情報が異なります。 プライベートシンボルには、関数名、グローバル変数、引数やローカル変数、ユーザー定義の構造体やクラスなどのデータ型に関する情報、ソースファイルのパスと実行命令のオフセットに対応する行番号が含まれています。 パブリックシンボルには関数名やextern宣言されたグローバル変数のみが含まれます。 プライベートシンボルに含まれる情報は外部に公開するべきではない製品の機密情報や実装の詳細に該当する可能性があるため、プライベートシンボルをアプリケーションやライブラリの利用者に提供する場合は注意が必要です。

なお、MicrosoftはWindowsを含む多くの製品についてパブリックシンボルを https://msdl.microsoft.com/download/symbols のシンボルサーバーで公開しています。 また、Visual C++ランタイムライブラリや.NETなどの一部の製品では、ソースコードとともにプライベートシンボルも公開されている場合があります。

シンボル読み込みの問題のトラブルシュート

シンボル読み込みがうまくいかず関数名やソースコードの情報が表示されない場合、問題のトラブルシュートのためにシンボル読み込みの過程や結果などを確認する必要があります。

WinDbgやVisual Studioは製品自体にシンボル読み込みの問題をトラブルシュートするためのコマンドや機能が用意されていますが、Process Monitorなどトラブルシュートのための機能が用意されていない製品もあります。 シンボルを扱うDbgHelp.dll自体でログ出力機能が提供されており、DBGHELP_LOG環境変数にログファイルのパスを指定することでシンボル読み込みの診断情報をログファイルに出力することが可能です。

なお、ユーザー環境変数に指定することも可能ですが、その場合は他のデバッガーなどがDbgHelp.dllを使用するときにも影響します。 そのため、トラブルシュートのための一時的なログ出力機能の利用では、管理者としてコマンドプロンプトを起動して以下のようにプロセスのスコープで環境変数を指定する方法が便利です。 ログ出力先のフォルダーは事前に作成しておく必要がありますので注意してください。

set DBGHELP_LOG=C:\temp\dbghelp.log
procmon.exe

DbgHelp.dllによって出力されたシンボル読み込みのログの例を記載します。 このログの例では、MicrosoftのブラウザーEdgeに含まれるmsedge.dllのシンボルファイルをMicrosoftのシンボルサーバーに照会しましたが、HTTP_STATUS_NOT_FOUNDの応答が返されて失敗し、最終的にDLL自体のエクスポートシンボル(エクスポートアドレステーブル:EAT)の情報を使用する判断に至ったことを示しています。 この場合、シンボル読み込みが失敗した原因としてはMicrosoftがmsedge.dllのパブリックシンボルを公開していない可能性が考えられます。

 SYMSRV:  BYINDEX: 0x8
          C:\Symbols*https://msdl.microsoft.com/download/symbols
          msedge.dll
          65FB328Dfcb8000
 SYMSRV:  UNC: C:\Symbols\msedge.dll\65FB328Dfcb8000\msedge.dll - path not found
 SYMSRV:  UNC: C:\Symbols\msedge.dll\65FB328Dfcb8000\msedge.dl_ - path not found
 SYMSRV:  UNC: C:\Symbols\msedge.dll\65FB328Dfcb8000\file.ptr - path not found
 SYMSRV:  HTTPGET: /download/symbols/index2.txt
 SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
 SYMSRV:  HTTPGET: /download/symbols/msedge.dll/65FB328Dfcb8000/msedge.dll
 SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
 SYMSRV:  HTTPGET: /download/symbols/msedge.dll/65FB328Dfcb8000/msedge.dl_
 SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
 SYMSRV:  HTTPGET: /download/symbols/msedge.dll/65FB328Dfcb8000/file.ptr
 SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
 SYMSRV:  RESULT: 0x80190194
 DBGHELP: Symbol Search Path: C:\Program Files (x86)\Microsoft\Edge\Application\122.0.2365.106
 DBGHELP: C:\Program Files (x86)\Microsoft\Edge\Application\122.0.2365.106\msedge.dll - OK
 DBGHELP: No header for C:\Program Files (x86)\Microsoft\Edge\Application\122.0.2365.106\msedge.dll.  Searching for image on disk
 DBGHELP: C:\Program Files (x86)\Microsoft\Edge\Application\122.0.2365.106\msedge.dll - OK
 DBGHELP: C:\Program Files (x86)\Microsoft\Edge\Application\122.0.2365.106\msedge.dll.pdb - file not found
 DBGHELP: C:\Program Files (x86)\Microsoft\Edge\Application\122.0.2365.106\dll\msedge.dll.pdb - file not found
 DBGHELP: C:\Program Files (x86)\Microsoft\Edge\Application\122.0.2365.106\symbols\dll\msedge.dll.pdb - file not found
 DBGHELP: C:\Program Files (x86)\Microsoft\Edge\Application\122.0.2365.106\msedge.dll.pdb - file not found
 DBGHELP: D:\a\_work\e\src\out\Release_x64\msedge.dll.pdb - file not found
 DBGHELP: msedge - export symbols

参考情報