符號路徑

DbgHelp 連結庫會使用符號搜尋路徑來尋找偵錯符號 (.pdb 和 .dbg 檔案)。 搜尋路徑可由以分號分隔的一或多個路徑元素組成。

指定搜尋路徑

若要指定符號處理程式在何處搜尋符號檔的磁碟目錄,請呼叫 SymSetSearchPath 函式。 或者,您可以在 SymInitialize 函式的 UserSearchPath 參數中指定符號搜尋路徑。

SymInitialize 中的 UserSearchPath 參數和 SymSetSearchPath 中的 SearchPath 參數會取得 Null 終止字串的指標,以指定路徑或以分號分隔的一系列路徑。 符號處理程式會使用這些路徑來搜尋符號檔。 如果此參數為 NULL,符號處理程式會搜尋包含要搜尋符號之模組的目錄。 否則,如果此參數指定為非 NULL 值,符號處理程式會先搜尋應用程式所設定的路徑,再搜尋模組目錄。 如果您設定_NT_SYMBOL_PATH或_NT_ALT_SYMBOL_PATH環境變數,符號處理程式會依下列順序搜尋符號檔:

  1. _NT_SYMBOL_PATH環境變數。
  2. _NT_ALT_SYMBOL_PATH環境變數。
  3. 包含對應模組的目錄。

若要擷取搜尋路徑,請呼叫 SymGetSearchPath 函式。

程序資料庫 (.pdb) 檔案的搜尋路徑與偵錯 (.dbg) 檔案的路徑不同。 演算法是由符號庫的功能所決定。 根據預設,Microsoft Visual C/C++ 會建立 Microsoft 格式符號、從影像中去除符號,並將其放在個別的 .pdb 檔案中。 一般而言,.pdb 檔案會位於包含可執行檔映像的目錄中。 Visual C/C++ 會在可執行檔映射中內嵌 .pdb 檔案的絕對路徑。 如果符號處理程式在該位置找不到 .pdb 檔案,或 .pdb 檔案已移至另一個目錄,則符號處理程式會使用 .dbg 檔案所述的搜尋路徑來尋找 .pdb 檔案。

Path 元素類型

路徑專案有三種類型。

標準路徑專案

在path元素所指定的目錄根目錄中尋找標準路徑元素,以搜尋標準路徑專案。 符號處理程式也會在符合所尋找符號之模組擴展名的「符號」子目錄中尋找。 這通常是 「dll」、“exe” 或 “sys”。 最後,它會在名為 「symbols」 的子目錄中,其目錄與擴充功能名稱相同。 例如,如果符號路徑元素是 「c:\mySymbols」,而搜尋符號的檔案是 「boo.dll」,則會搜尋下列目錄。

  • c:\mySymbols
  • c:\mySymbols\dll
  • c:\mySymbols\symbols\dll

符號處理程式會使用此邏輯來搜尋不符合符號伺服器快取準則的任何路徑專案(如下所述)。

符號伺服器路徑專案

符號伺服器路徑元素使用特殊技術,可找出與有問題的模組完全相符的符號。 如需詳細資訊,請參閱 使用 SymSrv

如果路徑專案以文字 「srv*」 開頭,符號處理程式會將路徑項目視為符號伺服器。

注意

如果未指定 「srv*」 文字,但實際的 path 元素是符號伺服器存放區,則符號處理程式會如同指定 「srv*」 一樣。 符號處理程式會藉由搜尋指定路徑根目錄中名為 「pingme.txt」 的檔案,來進行此判斷。

 

快取路徑專案

路徑專案是符號伺服器路徑項目的變化。

此目錄會像任何其他符號伺服器一樣搜尋。 不過,如果這裡找不到符號,而且它位於位於符號路徑鏈結更遠的路徑元素中,則會複製符號並儲存在此元素中指定的符號伺服器中。

如果路徑專案以文字 「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

輸出的前三行會顯示處理 的第一個路徑元素的 .符號處理程式。 這是標準路徑專案。

第四行顯示符號處理程式,使用符號伺服器來尋找檔案在第二個路徑元素 cache*c:\myCache 中,也就是快取路徑元素。

第五行顯示檔案位於 的第三個path元素 srv*\\symbols\symbols中,這是符號伺服器路徑專案。

第六行顯示檔案已複製到快取。

檔案從快取開啟的最後兩行。