閱讀英文

共用方式為


符號路徑

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 的第二個路徑元素中尋找檔案。

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

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

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