Windows 調試程式的符號路徑
符號路徑會指定 Windows 除錯工具(如 WinDbg、KD、CDB 和 NTST)搜尋符號檔的位置。 如需符號和符號檔的詳細資訊,請參閱 符號。
某些編譯程式,包括 Microsoft Visual Studio,將符號檔放在與二進位檔相同的目錄中。 符號檔和核取的二進位檔包含路徑和檔名資訊,讓調試程式自動尋找符號檔。 如果您在建置可執行檔的計算機上偵錯使用者模式進程,而且符號檔位於其原始位置,則調試程式可以在不設定符號路徑的情況下找到符號檔。
在其他大部分情況下,您必須將符號路徑設定為指向符號檔位置。
提示
使用 .symfix,為在許多情況下運作良好的公用Microsoft公用符號伺服器設定預設路徑。
符號路徑語法
調試程式的符號路徑是由以分號分隔的多個目錄路徑所組成的字串。 例如,C:\Dir1;C:\Dir2\DirA;C:\Dir2\DirB
。
支援相對路徑。 不過,除非您一律從相同的目錄啟動調試程式,否則您應該在每個路徑之前新增驅動器號或網路共用。 也支援網路共用。
針對符號路徑中的每個目錄,調試程式會在三個目錄中尋找。 例如,如果符號路徑包含 C:\Dir1
,而調試程式正在尋找 DLL 的符號資訊,調試程式會依序尋找下列目錄中的符號資訊:
C:\Dir1\symbols\dll
C:\Dir1\dll
C:\Dir1
然後調試程式會針對符號路徑中的每個目錄重複此程式。 最後,調試程式會在目前目錄中搜尋,然後在附加了..\dll
的目前目錄中搜尋。 調試程式會根據偵錯的二進位檔,附加 ..\dll
、..\exe
或 ..\sys
。
符號檔具有日期和時間戳。 調試程式一律會尋找符合其偵錯之二進位檔時間戳的符號。 您不必擔心調試程式會使用這個序列中第一個找到的錯誤符號。 如需了解當符號檔案無法取得時的回應方法,請參閱 比對符號名稱。
設定符號路徑的其中一種方式是輸入 .sympath 命令。 如需設定符號路徑的其他方式,請參閱本主題稍後的 控制符號路徑。
本機快取符號
您應該在本機快取符號。 在本機快取符號的其中一種方法是在您的符號路徑中包含 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
如果您的電腦上有手動放置符號的目錄,請勿使用該目錄作為從符號伺服器取得之符號的快取。 請改用兩個不同的目錄。 例如,您可以手動將符號放在 c:\MyRegularSymbols
,然後將 c:\MyServerSymbols
指定為從伺服器取得之符號的緩存。 下列範例示範如何在符號路徑中指定這兩個目錄。
.sympath C:\MyRegularSymbols;srv*C:\MyServerSymbols*https://msdl.microsoft.com/download/symbols
如需符號伺服器和符號存放區的詳細資訊,請參閱 自定義符號存放區和符號伺服器。
合併快取* 和 srv*
如果您在符號路徑中包含字符串 cache*;
,那麼從該字符串右邊出現的任何元素載入的符號,會儲存在本機電腦上的預設符號快取目錄中。 例如,下列命令會告訴調試程式從 Microsoft 符號伺服器和 存放區取得符號,並將其快取到預設的符號快取目錄中。
.sympath cache*;srv*https://msdl.microsoft.com/download/symbols
如果您在符號路徑中包含字串 cache*localsymbolcache;
,則從出現在此字串右邊的任何元素中載入的符號會儲存在 本地符號快取 目錄中。
例如,下列命令會告訴調試程式從 Microsoft符號伺服器取得符號, 儲存並快取 c:\MySymbols
目錄中的符號。
.sympath cache*C:\MySymbols;srv*https://msdl.microsoft.com/download/symbols
使用 AgeStore 減少快取大小
您可以使用 AgeStore 工具來刪除早於指定日期的快取檔案,或刪除足夠的舊檔案,讓產生的快取大小小於指定的數量。 如果您的下游存放區太大,此快取檔案的清除會很有用。
延遲符號載入
除錯程式的預設行為是使用 延遲符號載入,也稱為 延遲符號載入。 這種載入表示在需要符號之前,不會載入符號。
當符號路徑變更時,例如,使用 .sympath 命令,所有具有導出符號的載入模組都會延遲重載。
如果新路徑不再包含用來載入 PDB 符號的原始路徑,則具有完整 PDB 符號 的模組符號會延遲重載。 如果新路徑仍然包含 PDB 符號檔的原始路徑,則不會延遲重載這些符號。
您可以使用命令列選項 -s關閉 CDB 和 KD 中的延遲符號載入。 您也可以使用 ld 載入符號 命令,或使用 .reload 模組 命令搭配 /f
選項,來強制載入符號。
Azure DevOps Services 工件
在 Azure DevOps Services中,
控制符號路徑
若要控制符號路徑,您可以選取下列其中一種方法:
使用 .symfix set 符號存放區路徑的命令,為可在許多情況下良好運作的公用 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 嘈雜 或 -nWinDbg Command-Line 選項,在載入符號時顯示其他詳細數據。 如需其他疑難解答策略,請參閱 驗證符號。