共用方式為


進階符號使用

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

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

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

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

設定符號路徑

若要使用此符號伺服器,symsrv.dll必須安裝在與調試程式相同的目錄中。 您可以設定符號路徑,如下列程式代碼所示:

set _NT_SYMBOL_PATH = symsrv*ServerDLL*DownstreamStore*\\Server\Share

set _NT_SYMBOL_PATH = symsrv*ServerDLL*\\Server\Share

set _NT_SYMBOL_PATH = srv*DownstreamStore*\\Server\Share

set _NT_SYMBOL_PATH = srv*\\Server\Share

此語法的部分說明如下:

symsrv
這個關鍵詞必須一律先出現。 它向調試程式指出此專案是符號伺服器,而不只是一般符號目錄。

ServerDLL
指定符號伺服器 DLL 的名稱。 如果您使用 SymSrv 符號伺服器,這一律會symsrv.dll。

srv
這是 symsrv*symsrv.dll速記。

DownstreamStore
指定下游存放區。 這是將用來快取個別符號檔的本機目錄或網路共用。

您可以指定多個下游存放區,並以星號分隔。 此頁面會進一步說明 多個下游存放區中的串聯下游存放區

如果您在通常指定下游存放區的數據列中包含兩個星號,則會使用預設的下游存放區。 此存放區會位於主目錄的符號子目錄中。 主目錄預設為調試程式安裝目錄;您可以使用 !homedir 延伸模組或設定DBGHELP_HOMEDIR環境變數,來變更此專案。

如果 DownstreamStore 指定不存在的目錄,SymStore 會嘗試建立它。

如果省略 DownstreamStore 參數且未包含任何額外的星號,換句話說,如果您使用 srv 與完全相同的一個星號或符號,則不會建立任何下游存放區。 調試程式會直接從伺服器載入所有符號檔,而不需在本機快取它們。

注意 如果您要從 HTTP 或 HTTPS 網站存取符號,或符號存放區使用壓縮檔,則一律會使用下游存放區。 如果未指定下游存放區,則會在主目錄的符號子目錄中建立一個存放區。

\\Server\Share
指定遠端符號存放區的伺服器和共用。

如果使用下游存放區,調試程式會先在此存放區中尋找符號檔。 如果找不到符號檔,調試程式會從指定的 伺服器共用找到符號檔,然後在下游存放區中快取此檔案的複本。 檔案將會複製到下游存放區下樹狀目錄中的子目錄,其對應至 \\Server\Share樹狀結構中的位置。

符號伺服器不一定是符號路徑中唯一的專案。 如果符號路徑包含多個專案,調試程式會依序檢查每個專案是否有所需的符號檔(從左至右),不論符號伺服器或實際目錄是否命名。

以下列出一些範例。 若要使用 SymSrv 作為符號伺服器搭配 \\mybuilds\mysymbols 上的符號存放區,請設定下列符號路徑:

set _NT_SYMBOL_PATH= symsrv*symsrv.dll*\\mybuilds\mysymbols

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

set _NT_SYMBOL_PATH=symsrv*symsrv.dll*c:\localsymbols*\\mybuilds\mysymbols

若要設定符號路徑,調試程式會將符號檔從 HTTPS 月臺 https://www.company.com/manysymbols 複製到局域網路目錄 \\localserver\myshare\mycache,請使用:

set _NT_SYMBOL_PATH=symsrv*symsrv.dll*\\localserver\myshare\mycache*https://www.company.com/manysymbols

最後一個範例也可以縮短如下:

set _NT_SYMBOL_PATH=srv*\\localserver\myshare\mycache*https://www.company.com/manysymbols

此外,符號路徑可以包含數個目錄或符號伺服器,並以分號分隔。 這可讓您從多個位置尋找符號(甚至多個符號伺服器)。 如果二進位檔有不相符的符號檔,調試程式就無法使用符號伺服器找到它,因為它只會檢查確切的參數。 不過,調試程式可能會使用傳統符號路徑,找到名稱不相符的符號檔,並成功載入它。 雖然檔案在技術上不是正確的符號檔,但它可能會提供有用的資訊。

刪除快取

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

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

串聯下游存放區

您可以指定任意數目的下游存放區,並以星號分隔。 這些存放區稱為 級聯符號存放區

在初始 srv*symsrv*ServerDLL*之後,每個後續令牌都代表符號位置。 最左邊的令牌會先檢查。 空的標記 -- 以數據列中的兩個星號表示,或字串結尾的星號表示 -- 代表預設的下游存放區。

以下是使用兩個下游存放區保存所存取主要符號存放區資訊的符號路徑範例。 這些稱為主要存放區、中層存放區和本機快取:

srv*c:\localcache*\\interim\store*https://msdl.microsoft.com/download/symbols

在此案例中,SymSrv 會先在 c:\localcache 中尋找符號檔。 如果找到該檔案,則會傳回路徑。 如果找不到該處,它會在 \\interim\store 中查看。 如果找到符號檔,SymSrv 會將它複製到 c:\localcache 並傳回路徑。 如果找不到該檔案,SymSrv 會查看位於 https://msdl.microsoft.com/download/symbols的Microsoft公用符號存放區;如果找到該檔案,SymSrv 會將它複製到 \\interim\store 和 c:\localcache。

使用下列路徑會取得類似的行為:

srv**\\interim\store*https://internetsite

在此情況下,本機快取是預設的下游存放區,而主要存放區是因特網網站。 已指定 \\interim\store 的中層存放區,以在其他兩者之間使用。

當 SymSrv 處理包含串聯存放區的路徑時,它會略過任何無法讀取或寫入的存放區。 因此,如果共用關閉,它會將檔案從遺漏存放區下游複製到存放區,而不會發生任何錯誤。 此錯誤的一個良好副作用是,只要主存放區無法寫入,使用者就可以指定一個以上的主要存放區來饋送下游存放區的單一數據流。

從主要存放區擷取壓縮符號檔時,它會以壓縮形式儲存在任何中層存放區中。 檔案將會在路徑中最底層的存放區中取消壓縮。

使用 HTTP 和 SMB 符號伺服器路徑

如先前所述,鏈結(或串聯)是指符號路徑中每個 「*」 分隔符之間發生的複本。 符號會以由左至右的順序搜尋。 在每個遺漏時,會查詢下一個 (上游) 符號伺服器,直到找到檔案為止。

如果找到,檔案會從 (上游) 符號伺服器複製到上一個 (下游) 符號伺服器。 這會針對每個(下游)符號伺服器重複。 如此一來,下游符號伺服器就會使用符號伺服器來填入所有客戶端的集體工作。

即使鏈結的 UNC 路徑可以不使用 SRV* 前置詞,但建議您指定 SRV* ,以便使用symsrv.dll的進階錯誤處理。

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

只有在使用 SRV* 前置詞時,才支援 HTTP(由symsrv.dll符號處理程式實作)。

HTTP 和 SMB 共用符號伺服器案例範例

常見的 UNC 部署牽涉到裝載所有檔案(\\MainOffice\Symbols)、分公司快取子集 (\\BranchOfficeA\Symbols) 和桌面計算機 (C:\Symbols) 快取其參考的檔案的中央辦公室。

srv*C:\Symbols*\\BranchOfficeA\Symbols*\\MainOffice\Symbols

當SMB共用是主要 (上游) 符號存放區時,需要讀取。

srv*C:\Symbols*\\MachineName\Symbols

當SMB共用是中繼(下游)符號存放區時,需要讀取/變更。 用戶端會將檔案從主要符號存放區複製到SMB共用,然後從SMB共用複製到本機資料夾。

srv*C:\Symbols*\\MachineName\Symbols*https://msdl.microsoft.com/download/symbols
srv*C:\Symbols*\\MachineName\Symbols*\\MainOffice\Symbols

當 SMB 共用是 SymProxy 部署中的中繼(下游)符號存放區時,只需要讀取。 SymProxy ISAPI 篩選器會執行寫入,而不是用戶端。

srv*C:\Symbols*\\MachineName\Symbols*https://SymProxyName/Symbols

多個 HTTP 和 SMB 共用符號伺服器快取案例

您可以指定多個符號伺服器鏈結和快取位置,並以分號 “;” 分隔。 如果符號位於第一個鏈結中,則不會周遊第二個鏈結。 如果符號不在第一個鏈結中,則會周遊第二個鏈結,如果符號位於第二個鏈結中,則會在指定的位置快取它們。 如果第一個鏈結中指定的主要符號伺服器上沒有符號,此方法將允許一般使用主要符號伺服器,且只使用輔助伺服器。

srv*C:\Symbols*\\Machine1\Symbols*https://SymProxyName/Symbols;srv*C:\WebSymbols*https://msdl.microsoft.com/download/symbols

cache*localsymbolcache

另一個建立符號本機快取的方法,是在符號路徑中使用 cache*localsymbolcache 字串。 這不是符號伺服器元素的一部分,而是符號路徑中的個別專案。 調試程式會使用指定的目錄 localsymbolcache 來儲存從出現在此字串右邊之符號路徑中的任何專案載入的任何符號。 這可讓您針對從任何位置下載的符號使用本機快取,而不只是符號伺服器所下載的符號。

例如,下列符號路徑不會快取取從 \\someshare 取得的符號。 它會使用 c:\mysymbols 來快取取取從 \\anothershare 擷取的符號,因為開頭為 \\anothershare 的專案會出現在 cache*c:\mysymbols 元素的右邊。 它也會使用 c:\mysymbols 來快取從 Microsoft公用符號存放區擷取的符號,因為符號伺服器所使用的一般語法(srv 有兩個以上的星號)。 此外,如果您後續使用 .sympath+ 命令將其他位置新增至此路徑,這些新元素也會快取,因為它們會附加至路徑的右側。

_NT_SYMBOL_PATH=\\someshare\that\cachestar\ignores;srv*c:\mysymbols*https://msdl.microsoft.com/download/symbols;cache*c:\mysymbols;\\anothershare\that\gets\cached

SymSrv 如何找出檔案

SymSrv 會建立所需符號檔的完整 UNC 路徑。 此路徑的開頭是記錄在 _NT_SYMBOL_PATH 環境變數中符號存放區的路徑。 接著,SymbolServer 例程會用來識別所需的檔名;此名稱會附加至路徑做為目錄名稱。 另一個目錄名稱,由傳遞至 SymbolServer標識碼個和個參數串連所組成,接著會附加。 如果其中任何一個值為零,則會省略這些值。

產生的目錄會搜尋符號檔或符號存放區指標檔案。

如果此搜尋成功, SymbolServer 會將路徑傳遞至呼叫端 ,並傳 回 TRUE。 如果找不到檔案, SymbolServer 會傳 回 FALSE

使用 AgeStore 減少快取大小

AgeStore 工具可用來刪除早於指定日期的快取檔案,或減少低於指定大小的快取內容。 如果您的下游存放區太大,這非常有用。 如需詳細資訊,請參閱 AgeStore