シンボル パス
DbgHelp ライブラリは、シンボル検索パスを使用してデバッグ シンボル (.pdb ファイルと .dbg ファイル) を検索します。 検索パスは、セミコロンで区切られた 1 つ以上のパス要素で構成できます。
検索パスの指定
シンボル ハンドラーがディスク ディレクトリでシンボル ファイルを検索する場所を指定するには、SymSetSearchPath 関数を呼び出します。 または、SymInitialize 関数の UserSearchPath パラメーターでシンボル検索パスを指定することもできます。
SymInitialize の UserSearchPath パラメーターと、SymSetSearchPath の SearchPath パラメーター、パスを指定する null で終わる文字列、またはセミコロンで区切られた一連のパスへのポインターを受け取ります。 シンボル ハンドラーは、これらのパスを使用してシンボル ファイルを検索します。 このパラメーターが NULL 場合、シンボル ハンドラーは、シンボルが検索されているモジュールを含むディレクトリを検索します。 それ以外の場合、このパラメーターが非NULL 値として指定されている場合、シンボル ハンドラーは、モジュール ディレクトリを検索する前に、アプリケーションによって設定されたパスを最初に検索します。 _NT_SYMBOL_PATHまたは_NT_ALT_SYMBOL_PATH環境変数を設定すると、シンボル ハンドラーは次の順序でシンボル ファイルを検索します。
- _NT_SYMBOL_PATH環境変数。
- _NT_ALT_SYMBOL_PATH環境変数。
- 対応するモジュールを含むディレクトリ。
検索パスを取得するには、SymGetSearchPath 関数を呼び出します。
プログラム データベース (.pdb) ファイルの検索パスは、デバッグ (.dbg) ファイルのパスとは異なります。 アルゴリズムは、シンボル ライブラリの機能によって決定されます。 既定では、Microsoft Visual C/C++ によって Microsoft 形式のシンボルが作成され、イメージから削除され、別の .pdb ファイルに配置されます。 通常、.pdb ファイルは実行可能イメージを含むディレクトリに配置されます。 Visual C/C++ では、実行可能イメージ内の .pdb ファイルへの絶対パスが埋め込まれます。 シンボル ハンドラーがその場所で .pdb ファイルを見つけることができない場合、または .pdb ファイルが別のディレクトリに移動された場合、シンボル ハンドラーは、.dbg ファイルについて説明されている検索パスを使用して .pdb ファイルを検索します。
Path 要素の型
パス要素には 3 種類あります。
Standard Path 要素
標準パス要素は、path 要素で指定されたディレクトリのルートを調べることで検索されます。 シンボル ハンドラーは、シンボルが検索されているモジュールのファイル拡張子と一致する "symbols" のサブディレクトリも検索します。 これは通常、"dll"、"exe"、または "sys" です。 最後に、拡張機能と同じ名前のディレクトリを持つ "symbols" という名前のサブディレクトリを検索します。 たとえば、シンボル パス要素が "c:\mySymbols" で、シンボルが検索されるファイルが "boo.dll" の場合、次のディレクトリが検索されます。
- c:\mySymbols
- c:\mySymbols\dll
- c:\mySymbols\symbols\dll
シンボル ハンドラーは、このロジックを使用して、条件を満たしていないパス要素を検索して、シンボル サーバー またはキャッシュ します (後述)。
Symbol Server Path 要素
シンボル サーバー パス要素では、問題のモジュールと完全に一致するシンボルを見つけ出すことができる特別なテクノロジが使用されます。 詳細については、SymSrv の使用に関する を参照してください。
シンボル ハンドラーは、"srv*" というテキストで始まる場合、パス要素をシンボル サーバーとして扱います。
手記
"srv*" テキストが指定されていないが、実際のパス要素がシンボル サーバー ストアの場合、シンボル ハンドラーは "srv*" が指定されたかのように動作します。 シンボル ハンドラーは、指定したパスのルート ディレクトリに "pingme.txt" という名前のファイルが存在するかどうかを検索して、この決定を行います。
Cache Path 要素
キャッシュ パス要素は、シンボル サーバー パス要素のバリエーションです。
このディレクトリは、他のシンボル サーバーと同様に検索されます。 ただし、シンボルがここに見つからず、シンボル パスのチェーンの下にあるパス要素に見つかった場合、シンボルはコピーされ、この要素で指定されたシンボル サーバーに格納されます。
シンボル ハンドラーは、"cache*" というテキストで始まる場合、パス要素をキャッシュ要素として扱います。 "c:\myCache" でキャッシュを指定するには、"cache*c:\myCache" のシンボル パス要素を使用します。
検索パスの例
このしくみを確認するには、この検索パスを設定します。
cache*c:\myCache;srv*\\symbols\symbols
上記の検索パスを使用して ntdll.pdb を検索する際のシンボル ハンドラーの詳細出力の一覧を次に示します。
DBGHELP: .\ntdll.pdb - file not found
DBGHELP: .\dll\ntdll.pdb - file not found
DBGHELP: .\symbols\dll\ntdll.pdb - file not found
SYMSRV: c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb not found
SYMSRV: ntdll.pdb from \\symbols\symbols: 10497024 bytes - copied
DBGHELP: c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb already cached
DBGHELP: ntdll - private symbols & lines
c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb
出力の最初の 3 行は、.
の最初のパス要素を処理するシンボル ハンドラーを示しています。 これは標準のパス要素です。
4 行目は、シンボル サーバーを使用して、キャッシュ パス要素である cache*c:\myCache
の 2 番目のパス要素でファイルを検索するシンボル ハンドラーを示しています。
5 行目は、シンボル サーバー パス要素である srv*\\symbols\symbols
の 3 番目のパス要素にファイルが見つかった場合を示しています。
6 行目は、ファイルがキャッシュにコピーされることを示しています。
ファイルがキャッシュから開かれる最後の 2 行。