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 會立即在右側相鄰的符號存放區中尋找。 如果檔案存在,則會複製到左側存放區,並從該處開啟。
如果有兩個以上的存放區,此行為會持續到右側,直到找到檔案或清單中沒有更多存放區為止。
檔案只會從最左邊的存放區開啟,永不會從其他存放區開啟。 如果在鏈結中其他地方找到檔案,則會將它複製到它左邊的每個存放區。 此複製過程稱為「串接」,並提供本檔稍後會說明的某些優點。
符號存放區的類型
下表顯示支援的符號存放區類型的範例。
因為 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 作業系統的符號,包括修補程式、服務包(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 連結庫。