使用 SymSrv

SymSrv 會從集中式符號存放區傳遞符號檔。 這些存放區可以包含任意數目的符號檔,對應至任意數目的程式或操作系統。 存放區也可以包含二進位檔,在偵錯小型傾印檔案時特別有用。

存放區可以包含實際的符號和二進位檔,或只是符號檔的指標。 如果存放區包含指標,SymSrv 會直接從其來源擷取實際檔案。

SymSrv 也可以將大型符號存放區分成適合特製化偵錯工作的較小子集。

最後,SymSrv 可以使用操作系統所提供的登入資訊,從 HTTP 或 HTTPS 來源取得符號檔。 SymSrv 支援受智慧卡、憑證和一般登入和密碼保護的 HTTPS 網站。

設定符號路徑

如符號路徑中所述,符號路徑(_NT_SYMBOL_PATH環境變數)可以由數個以分號分隔的路徑元素所組成。 如果上述任一或多個路徑元素以文字 「srv*」 開頭,則元素是符號伺服器,並使用 SymSrv 尋找符號檔。

注意

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

 

就像符號路徑是由以分號分隔的符號路徑元素所組成,符號伺服器是由以星號分隔的符號存放區元素所組成。 “srv*” 前置詞之後最多可以有 10 個符號存放區。 清單左邊列出的存放區稱為 下游 存放區,右邊的存放區稱為 上游 存放區。

srv\**SymbolStore* srv\**SymbolStore1*\**SymbolStoreN*

如果路徑中只包含一個符號存放區專案,SymSrv 會嘗試直接從該存放區使用任何要求的檔案。

如果路徑中有兩個符號存放區,SymSrv 會在最左邊的符號存放區中尋找符號檔。 如果檔案存在,則會使用它。 如果不存在,SymSrv 會立即在符號存放區中尋找右側。 如果檔案存在,則會複製到左側存放區,並從該處開啟。

如果有兩個以上的存放區,此行為會持續到右側,直到找到檔案或清單中沒有更多存放區為止。

檔案永遠不會從任何存放區開啟,但最左邊的存放區。 如果在鏈結中其他地方找到檔案,則會將它複製到它左邊的每個存放區。 此複製程式稱為「串連」,並提供本檔稍後會擷取的某些優點。

符號存放區的類型

下表顯示支援的符號存放區類型的範例。

符號存放區類型 描述
\\server\share 遠端伺服器上共用的完整 UNC 路徑。
c:\LocalCache 用戶端電腦上目錄的路徑。
https://InternetSite 裝載符號的網站 URL。 必須是清單中最右邊的存放區,而且不應該是清單中唯一的存放區。
https://SecureInternetSite 裝載符號的安全網站 URL。 這可支持密碼、Windows 登入認證、憑證和智慧卡。 必須是清單中最右邊的存放區,而且不應該是清單中唯一的存放區。
<空白> 如果兩個星號之間沒有文字,這表示預設的 下游存放區。 位置是藉由呼叫 SymSetHomeDirectory 來設定。 默認值是名為 「sym」 的目錄,緊接在呼叫應用程式的程式目錄下方。 這有時稱為預設本機 快取

 

因為 HTTP 符號存放區無法寫入,所以它必須是清單中最右邊的存放區。 如果 HTTP 符號存放區位於存放區清單的中間或左邊,則無法複製任何找到的檔案,而且鏈結會中斷。 此外,由於符號處理程式無法從網站開啟檔案,所以 HTTP 型存放區不應該是清單最左邊或只有存放區。 如果 SymSrv 曾經顯示此符號路徑,它會嘗試將檔案複製到預設下游存放區,並從該處開啟它,而不論符號路徑中是否指出預設下游存放區。

範例

若要在 \\mybuilds\mysymbols 上搭配符號存放區使用 SymSrv,請設定下列符號路徑:

set _NT_SYMBOL_PATH= srv*\\mybuilds\mysymbols

若要設定符號路徑,調試程式會將符號檔從 \\mybuilds\mysymbols 上的符號存放區複製到本機目錄 c:\localymbols,請使用:

set _NT_SYMBOL_PATH=srv*c:\localsymbols*\\mybuilds\mysymbols

若要設定符號路徑,調試程式會將符號檔從 \\mybuilds\mysymbols 上的符號存放區複製到預設下游存放區(通常是 c:\debuggers\sym),請使用:

set _NT_SYMBOL_PATH=srv**\\mybuilds\mysymbols

若要使用串聯存放區,請設定下列符號路徑:

set _NT_SYMBOL_PATH = srv*c:\localsymbols*\\NearbyServer\store*https://DistantServer

在此範例中,SymSrv 會先在 c:\localsymbols 中尋找檔案。 如果找到該檔案,則會傳回檔案的路徑。 否則,SymSrv 會在 \\NearbyServer\store 中尋找檔案。 如果找到該檔案,SymSrv 會將檔案複製到 c:\localsymbols,並傳回檔案的路徑;如果找不到,SymSrv 會在 中 https://DistantServer尋找檔案,如果找到該檔案,SymSrv 會將檔案複製到 \\NearbyServer\store,然後複製到 c:\localsymbols。

最後一個範例示範如何使用符號路徑的明智設計來優化符號的下載。 如果您有一組調試程式的工作網站,而且它們都需要從遙遠的位置取得符號,您可以使用靠近所有調試程式的符號存放區來設定通用伺服器。 然後使用上述符號路徑來設定每個調試程式。 第一個需要特定版本的 foo.pdb 調試程式會從 https://DistantServer 下載到 \\NearbyServer\store,然後在 c:\localsymbols 中將其下載到自己的計算機。 下一個需要相同檔案的調試程式將能夠從 \\NearbyServer\store 下載它,因為它已經由上一個調試程序下載到該位置。 此多層級快取可節省大量時間和網路頻寬。

Microsoft 符號存放區

Microsoft 提供因特網符號伺服器的存取權,其中包含許多 Windows 作業系統版本的符號檔。 此符號目錄不保證完整,但它很廣泛。 也會代表其他 Microsoft 產品。

因特網符號伺服器會填入 Microsoft Windows 操作系統的各種 Windows 符號,包括熱門修正、Service Pack、安全性匯總套件和零售版本。 目前適用於 Windows 產品的 Beta 和發行候選專案,以及各種其他 Microsoft 產品,例如 Microsoft Internet Explorer,也可在伺服器上取得符號。

如果您在偵錯期間可以存取因特網,您可以將調試程式設定為在偵錯會話期間視需要下載符號,而不是在偵錯會話之前個別下載符號檔。 符號會下載到您指定的目錄位置,然後調試程式會從該處載入它們。

Microsoft 符號存放區的 URL 為 https://msdl.microsoft.com/download/symbols。 下列範例示範如何設定調試程式符號路徑(以您的下游存放區路徑取代 c:\DownstreamStore):

srv*c:\DownstreamStore*https://msdl.microsoft.com/download/symbols

壓縮檔案

SymSrv 與包含壓縮檔的符號存放區相容,只要此壓縮已預先格式化為 Windows Server 2003 資源套件所散發的compress.exe工具。 壓縮文件應該有底線做為其擴展名的最後一個字元(例如,module1.pd_或module2.db_)。 如需詳細資訊,請參閱 使用 SymStore

串聯時,除非目標存放區是路徑中最左邊的存放區,否則不會解壓縮檔案。 如果路徑中只有一個存放區且包含壓縮檔案,SymSrv 會將檔案複製到預設的下游存放區,並從該處開啟它,即使預設下游存放區並未在符號路徑中指出。

DbgHelp 6.1 和更早版本: 如果主要存放區中的檔案經過壓縮,您必須使用下游存放區。 SymSrv 會先解壓縮所有檔案,再將它們複製到下游存放區。

刪除快取

如果您使用下游存放區作為快取,您可以隨時刪除此目錄以節省磁碟空間。

可以有一個龐大的符號存放區,其中包含許多不同程式或 Windows 版本的符號檔。 如果您升級目標計算機上所使用的 Windows 版本,快取的符號檔將會全部符合舊版。 這些快取的檔案不會進一步使用,因此這可能是刪除快取的好時機。

適用於 Windows 的偵錯工具隨附名為 agestore.exe 的公用程式,可選擇性地從目錄樹狀目錄中移除檔案,留下最近使用的檔案。 此工具的設計目的是從符號伺服器存放區剪除未使用的檔案。 它可讓您控制許多選項,包括關閉日期和目錄大小演算法。

一般快取目錄

可以將預設下游存放區宣告為一般目錄,而不是標準符號樹狀結構。 若要這樣做,請使用 SYMOPT_FLAT_DIRECTORY 呼叫 SymSetOptions 函式(這也會在 SymSrv 中設定SSRVOPT_FLAT_DEFAULT_STORE選項)。 請務必先呼叫 SymSetHomeDirectory ,再這麼做;否則,符號檔可以寫入程序目錄。

指標檔案

SymStore 可以建立並使用指向目標檔案的檔案,而不是目標檔案本身。 如果符號存放區包含這類指標檔案,則預設值是將檔案從指標檔案中指示的位置複製到存放區。 若要設定存放區,以便複製指標檔案,而不是指向的檔案,請在目標存放區的根目錄中建立名為 wantsptr.txt 的檔案。 wantsptr.txt的內容並不重要,只有檔案存在。

從符號清單排除檔案

若要從符號搜尋中排除檔案,您可以在symsrv.ini或登錄中指定其名稱。 若要在 symsrv.ini中指定檔案,請建立名為 Exclusions 的區段並列出檔案。 檔名可以包含通配符,如下列範例所示:

[Exclusions]
dbghelp.pdb
symsrv.*
mso*

Symsrv.ini應該位於symsrv.dll所在的相同目錄中。 在大部分的安裝中,檔案不存在,您必須建立新的檔案。

或者,您可以將要排除的檔案儲存在登錄中。 建立下列登錄機碼: HKEY_LOCAL_MACHINE\Software\Microsoft\Symbol Server\Exclusions。 將此索引鍵中的每個檔案名儲存為字串值 (REG_SZ)。 字串值的名稱會指定要排除的檔名。 您可以使用字串值的內容來儲存批註,描述檔案被排除的原因。

安裝

SymSrv (symsrv.dll) 符號伺服器包含在 Windows 套件的偵錯工具中。 它必須安裝在與您載入dbghelp.dll復本相同的目錄中。 如需詳細資訊,請參閱 呼叫 DbgHelp 連結庫