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

シンボル パスは、WinDbg、KD、CDB、NTSTなどのWindows デバッガーがシンボル ファイルを検索する場所を指定します。 シンボルとシンボル ファイルの詳細については、シンボルに関する記事を参照してください。

Microsoft Visual Studioを含む一部のコンパイラでは、バイナリ ファイルと同じディレクトリにシンボル ファイルが配置されます。 シンボル ファイルとチェックされたバイナリ ファイルには、パスとファイル名の情報が含まれているため、デバッガーはシンボル ファイルを自動的に検索できます。 実行可能ファイルがビルドされたコンピューターでユーザー モード プロセスをデバッグし、シンボル ファイルが元の場所にある場合、デバッガーはシンボル パスを設定しなくてもシンボル ファイルを見つけることができます。

その他のほとんどの状況では、シンボル ファイルの場所を指すようにシンボル パスを設定する必要があります。

ヒント

.symfix を使用して、多くの状況で適切に動作するパブリック Microsoft パブリック シンボル サーバーへのデフォルトパスを設定します。

シンボル パスの構文

デバッガーのシンボル パスは、セミコロンで区切られた複数のディレクトリ パスで構成される文字列です。 たとえば、C:\Dir1;C:\Dir2\DirA;C:\Dir2\DirB のようにします。

相対パスがサポートされています。 ただし、常に同じディレクトリからデバッガーを起動する場合を除き、各パスの前にドライブ文字またはネットワーク共有を追加する必要があります。 ネットワーク共有もサポートされています。

シンボル パス内のディレクトリごとに、デバッガーでは 3 つのディレクトリが検索されます。 たとえば、シンボル パスに含まれ C:\Dir1 ていて、デバッガーがDLLのシンボル情報を検索する場合、デバッガーは次のディレクトリでシンボル情報を順番に検索します。

  • C:\Dir1\symbols\dll
  • C:\Dir1\dll
  • C:\Dir1

その後、デバッガーでは、シンボル パス内のディレクトリごとにこのプロセスが繰り返されます。 最後に、デバッガーでは現在のディレクトリが検索された後、現在のディレクトリに ..\dll を追加した場所が検索されます。 デバッガーは、どのバイナリをデバッグしているかに応じて、 ..\dll、または ..\exe次のバイナリを追加します ..\sys

シンボル ファイルには、日付と時刻のスタンプがあります。 デバッガーは、デバッグ中のバイナリ ファイルのタイム スタンプに一致するシンボルを常に検索します。 デバッガーが、このシーケンスで最初に検出した間違ったシンボルを使用することを心配する必要はありません。 シンボル ファイルが使用できない場合の応答の詳細については、 「シンボル名の 照合」を参照してください。

シンボル パスを設定する方法の 1 つは、.sympath コマンドを入力することです。 シンボル パスを設定するその他の方法については、このトピックで後述する 「シンボル パスを制御する」 を参照してください 。

シンボルをローカルにキャッシュする

シンボルはローカルにキャッシュする必要があります。 シンボルをローカルにキャッシュする方法の 1 つは、シンボル パスに cache*; または cache*localsymbolcache;* を含めることです。

シンボル パスに cache*; という文字列を含めた場合、この文字列の右側にある要素から読み込まれたシンボルは、ローカル コンピューターの既定のシンボル キャッシュ ディレクトリに格納されます。 たとえば、次のコマンドは、名前が付けられ \\someshare たネットワーク共有からシンボルを取得し、ローカル コンピューター上の既定の場所にシンボルをキャッシュするようにデバッガーに指示します。

.sympath cache*;\\someshare

シンボル パスに cache*localsymbolcache; という文字列を含めた場合、この文字列の右側にある要素から読み込まれたシンボルは、localsymbolcache ディレクトリに格納されます。

たとえば、次のコマンドでは、\\someshare ネットワーク共有からシンボルを取得し、c:\MySymbols ディレクトリにシンボルをキャッシュするように、デバッガーに指示されます。

.sympath cache*C:\MySymbols;\\someshare

シンボル サーバーの使用 : srv*

インターネットまたは企業ネットワークに接続している場合、シンボルにアクセスする最も効率的な方法は、パブリック Microsoftパブリック シンボル サーバーなどのシンボル サーバーを使用することです。 シンボル サーバーを使用するには、シンボル パスで次のいずれかの文字列を使用します。

  • srv* 文字列

    シンボル パスに文字列 srv* を含めると、デバッガーではシンボル サーバーを使用して既定のシンボル ストアからシンボルが取得されます。 たとえば、次のコマンドは、既定のシンボル ストアからシンボルを取得するようにデバッガーに指示します。 これらのシンボルは、ローカル コンピューターにキャッシュされません。

    .sympath srv*
    
  • srv*symbolstore 文字列

    シンボル パスに文字列 srv*symbolstore を含めると、デバッガーはシンボル サーバーを使用してシンボルストア からシンボルを取得します。 例えば、次のコマンドはデバッガーに Microsoftシンボル サーバー ストアからシンボルを取得するように指示します。 これらのシンボルは、ローカル コンピューターにキャッシュされません。

    .sympath srv*https://msdl.microsoft.com/download/symbols
    
  • srv*localsymbolcache*symbolstore 文字列

    シンボル パスに文字列 srv*localcache*symbolstore を含めると、デバッガーはシンボル サーバーを使用してシンボルストア から シンボルを取得し、localcache ディレクトリに キャッシュします。 たとえば、次のコマンドは、Microsoftシンボル サーバーhttps://msdl.microsoft.com/download/symbols からシンボルを取得し、シンボル c:\MyServerSymbolsをキャッシュするようにデバッガーに指示します。

    .sympath srv*C:\MyServerSymbols*https://msdl.microsoft.com/download/symbols
    

シンボルを手動で配置するディレクトリがコンピューター上にある場合は、そのディレクトリをシンボル サーバーから取得したシンボルのキャッシュとして使用しないでください。 代わりに、2 つの異なるディレクトリを使用します。 たとえば、c:\MyRegularSymbols に手動でシンボルを配置し、サーバーから取得されたシンボルのキャッシュとして c:\MyServerSymbols を指定することができます。 次の例は、シンボル パスで両方のディレクトリを指定する方法を示したものです。

.sympath C:\MyRegularSymbols;srv*C:\MyServerSymbols*https://msdl.microsoft.com/download/symbols

シンボル サーバーとシンボル ストアについて詳しくは、「 カスタム シンボル ストアとシンボル サーバー」をご覧ください。

cache* とsrv* の組み合わせ

シンボル パスに cache*; という文字列を含めた場合、この文字列の右側にある要素から読み込まれたシンボルは、ローカル コンピューターの既定のシンボル キャッシュ ディレクトリに格納されます。 たとえば、次のコマンドは、Microsoftシンボル サーバー ストアから シンボルを取得し、既定のシンボル キャッシュ ディレクトリにキャッシュするようにデバッガーに指示します。

.sympath cache*;srv*https://msdl.microsoft.com/download/symbols

シンボル パスに cache*localsymbolcache; という文字列を含めた場合、この文字列の右側にある要素から読み込まれたシンボルは、localsymbolcache ディレクトリに格納されます。

たとえば、次のコマンドは、 Microsoftシンボル サーバー ストアから シンボルを取得し、シンボル を c:\MySymbols ディレクトリにキャッシュするようにデバッガーに指示します。

.sympath cache*C:\MySymbols;srv*https://msdl.microsoft.com/download/symbols

AgeStore を使用してキャッシュのサイズを小さくする

AgeStore ツールを使用して、指定した日付より古いキャッシュ ファイルを削除したり、結果のキャッシュ サイズが指定した量より小さくなるように十分な数の古いファイルを削除したりできます 。 このキャッシュ ファイルのクリーンアップは、ダウンストリーム ストアが大きくなりすぎた場合に便利です。

シンボルの遅延読み込み

デバッガーの既定の動作では、 "シンボルの遅延読み込み"("遅延シンボル読み込み"とも呼ばれます) が使用されます 。 この種の読み込みは、シンボルが必要になるまで読み込まれないことを意味します。

シンボル パスが変更されると、たとえば sympath コマンド を使用して、エクスポート シンボルを使用して読み込まれたすべてのモジュールが遅延再読み込みされます。

完全な PDB シンボル が含まれるモジュールのシンボルは、PDB シンボルの読み込みに使用された元のパスが新しいパスに含まれなくなった場合、遅延で再読み込みされます。 PDB シンボル ファイルへの元のパスが新しいパスにまだ含まれる場合は、それらのシンボルは遅延で再読み込みされません。

CDBとKDでのシンボルの遅延読み込みをオフにするには、 -sコマンド ライン オプションを使用します。 また、 ld load symbols コマンドを使用するか、 .reload moduleコマンド を オプションとともに使用 して、 /f シンボルのロード を強制することもできます。

Azure DevOps Services の成果物

シンボル サーバーは、 Azure DevOps Services の Azure Artifactsで使用できます。 WinDbgでのAzure Artifactsの操作については、「WinDbg でシンボルを使用してデバッグする」を参照してください。 Azureで生成されたシンボルに関する一般的な情報については、 「シンボルの概要」を参照してください。

シンボル パスを制御

シンボル パスを制御するには、次のいずれかの方法を選択できます。

  • .symfix set symbol store path コマンド を使用して、多くの状況で適切に動作するパブリック Microsoft シンボル サーバーへの既定のパスを設定します。 ローカル キャッシュを設定するには、次のように入力します .symfix C:\MyCache

  • .sympathコマンドを使用して 、パスを表示、設定、変更、または追加します。

  • デバッガー開始前に、_NT_SYMBOL_PATH および _NT_ALT_SYMBOL_PATH環境変数を使用して、パスを設定します。 シンボル パスは、_NT_ALT_SYMBOL_PATH の後に _NT_SYMBOL_PATH を追加することによって作成されます。 (通常、パスは _NT_SYMBOL_PATH によって設定されます。 ただし、共有シンボル ファイルのプライベート バージョンがある場合など、特殊なケースでは、 _NT_ALT_SYMBOL_PATH を使用してこれらの設定をオーバーライドすることができます。) これらの環境変数を使用して無効なディレクトリを追加しようとすると、デバッガーではこのディレクトリが無視されます。

  • デバッガーを起動するときに、 -y コマンドライン オプション を使用してソース パスを設定します。

  • WinDbgでのみ、ファイル| [シンボル ファイル パス] コマンド を使用するか、を押して CTRL+S 、パスを表示、設定、変更、または追加します。

-sins コマンドライン・オプションを使用すると、デバッガーはシンボル・パス環境変数を無視します。

トラブルシューティング

!sym noisy または -nWinDbg コマンド ライン オプションを使用して、シンボルが読み込まれたときに追加の詳細を表示します。 その他のトラブルシューティング方法については、 「シンボルの検証」を参照してください。

関連項目

記号

SymSrv の高度な使用方法

.sympath コマンド

.symfix