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;
,則從任何出現在此字串右邊的專案載入的符號會儲存在 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 load symbols 命令或使用 .reload 模組命令 搭配 /f
選項,強制載入符號。
Azure DevOps Services 成品
符號伺服器可在 Azure DevOps Services 中使用 Azure Artifacts。 若要瞭解如何在 WinDbg 中使用 Azure Artifacts,請參閱 使用 WinDbg 中的符號進行偵錯。 如需 Azure 產生的符號的一般資訊,請參閱 符號概觀。
控制符號路徑
若要控制符號路徑,您可以選取下列其中一種方法:
使用 .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 嘈雜或 -n WinDbg 命令行選項,在載入符號時顯示其他詳細數據。 如需其他疑難解答策略,請參閱 驗證符號。