使用 SymStore

SymStore (symstore.exe) 是用來建立符號存放區的工具。 它包含在 Windows 套件的偵錯工具中。

SymStore 會以格式儲存符號,讓調試程式根據影像的時間戳和大小來查閱符號(針對 .dbg 或可執行檔),或簽章和存留期(適用於 .pdb 檔案)。 符號存放區優於傳統符號儲存格式的優點是,所有符號都可以儲存或參考在同一部伺服器上,並由調試程式擷取,而不需要事先知道哪些產品包含對應的符號。

請注意,多個 .pdb 符號檔版本(例如,公用和私人版本)無法儲存在相同的伺服器上,因為它們各自包含相同的簽章和存留期。

SymStore 交易

每個對 SymStore 的呼叫都會記錄為交易。 交易有兩種類型:新增和刪除。

建立符號存放區時,會在伺服器根目錄下建立名為 「000admin」 的目錄。 000admin 目錄包含每個交易的一個檔案,以及記錄檔Server.txt和History.txt。 Server.txt檔案包含目前在伺服器上的所有交易清單。 History.txt檔案包含所有交易的時間歷程記錄。

每次 SymStore 儲存或移除符號檔時,都會建立新的交易編號。 然後,會在 000admin 中建立名為此交易編號的檔案。 此檔案包含此交易期間已新增至符號存放區的所有檔案或指標清單。 如果刪除交易,SymStore 會讀取其交易檔案,以判斷它應該刪除的檔案和指標。

adddel 選項會指定是否要執行新增或刪除交易。 包含新增作業的 /p 選項會指定要加入指標;省略 /p 選項會指定要加入實際符號檔。

您也可以在兩個不同的階段中建立符號存放區。 在第一個階段中,您可以使用 SymStore 搭配 /x 選項來建立索引檔案。 在第二個階段中,您可以使用 SymStore 搭配 /y 選項,從索引檔中的資訊建立檔案或指標的實際存放區。

這可以是各種原因的實用技術。 例如,這可讓符號存放區在某種方式遺失時輕鬆重新建立,只要索引檔案仍然存在。 或者,包含符號檔的計算機與將建立符號存放區的計算機有緩慢的網路連線。 在此情況下,您可以在與符號檔相同的計算機上建立索引檔案、將索引檔案傳送至第二部計算機,然後在第二部計算機上建立存放區。

如需所有 SymStore 參數的完整清單,請參閱 SymStore 命令行選項

注意

SymStore 不支援來自多個用戶的同時交易。 建議指定一個用戶符號存放區的「系統管理員」,並負責所有 新增del 交易。

 

交易範例

以下是將 Windows Server 2003 組建 3790 的符號指標新增至 \\sampledir\symsrv 的兩個範例:

symstore add /r /p /f \\BuildServer\BuildShare\3790free\symbols\*.*
   /s \\sampledir\symsrv /t "Windows Server 2003" /v "Build 3790 x86 free"
   /c "Sample add"
symstore add /r /p /f \\BuildServer\BuildShare\3790Chk\symbols\*.* 
   /s \\sampledir\symsrv /t "Windows Server 2003" /v "Build 3790 x86 checked"
   /c "Sample add"

在下列範例中,SymStore 會將 \\largeapp\appserver\bins 中應用程式專案的實際符號檔新增至 \\testdir\symsrv:

symstore add /r /f \\largeapp\appserver\bins\*.* /s \\testdir\symsrv 
   /t "Large Application" /v "Build 432" /c "Sample add"

以下是如何使用索引檔案的範例。 首先,SymStore 會根據 \\largeapp\appserver\bins\ 中的符號檔集合來建立索引檔案。 在此情況下,索引檔案會放在第三部計算機 \\hubserver\hubshare。 您可以使用 /g 選項來指定檔案前置詞 “\\largeapp\appserver” 未來可能會變更:

symstore add /r /p /g \\largeapp\appserver /f 
   \\largeapp\appserver\bins\*.* 
   /x \\hubserver\hubshare\myindex.txt

現在假設您將所有符號檔從計算機 \\largeapp\appserver 移出,並將其放在 \\myarchive\appserver 上。 然後,您可以從索引檔案 \\hubserver\hubshare\myindex.txt建立符號存放區本身,如下所示:

symstore add /y \\hubserver\hubshare\myindex.txt 
   /g \\myarchive\appserver /s \\sampledir\symsrv /p 
   /t "Large Application" /v "Build 432" /c "Sample Add from Index"

最後,以下是刪除上一筆交易所新增檔案的 SymStore 範例。 如需如何判斷交易標識碼的說明,請參閱下一節(在此案例中為0000000096)。

symstore del /i 0000000096 /s \\sampledir\symsrv

壓縮檔案

SymStore 可以透過兩種不同的方式搭配壓縮檔使用。

  1. 使用 SymStore 搭配 /p 選項來儲存符號檔的指標。 SymStore 完成之後,壓縮指標所參考的檔案。
  2. 使用 SymStore 搭配 /x 選項來建立索引檔案。 SymStore 完成之後,壓縮索引檔中列出的檔案。 然後使用 SymStore 搭配 /y 選項 (以及,如果您想要 ,則為 /p 選項)來儲存符號存放區中的檔案或檔案指標。 (SymStore 不需要解壓縮檔案才能執行這項作業。

您的符號伺服器會負責在需要時取消壓縮檔案。

如果您使用 SymSrv 作為符號伺服器,則任何壓縮都應該使用隨 Microsoft Windows 軟體開發工具包 (SDK) 一起散發的 compress.exe 工具來完成。 壓縮文件應該有底線做為其擴展名的最後一個字元(例如,module1.pd_或module2.db_)。 如需詳細資訊,請參閱 使用 SymSrv

server.txt和history.txt檔案

新增交易時,會將數個專案的資訊新增至server.txt,並history.txt以供日後查閱功能使用。 以下是新增交易的server.txt和history.txt行範例:

0000000096,add,ptr,10/09/99,00:08:32,Windows XP,x86 fre 1.156c-RTM-2,Added from \\mybuilds\symbols,

這是以逗號分隔的行。 欄位的定義如下。

欄位 描述
0000000096 由 SymStore 建立的交易標識碼。
add 交易的類型。 此欄位可以是 adddel
ptr 是否已新增檔案或指標。 此欄位可以是 檔案ptr
10/09/99 發生交易的日期。
00:08:32 交易啟動時的時間。
Windows XP 產品:
x86 fre 版本(選擇性)。
已從 新增 註解 (選擇性)
未使用 (保留供稍後使用。

 

以下是交易檔案0000000096的一些范例行。 每一行都會記錄目錄,以及新增至目錄的檔案或指標位置。

canon800.dbg\35d9fd51b000,\\mybuilds\symbols\sp4\dll\canon800.dbg
canonlbp.dbg\35d9fd521c000,\\mybuilds\symbols\sp4\dll\canonlbp.dbg
certadm.dbg\352bf2f48000,\\mybuilds\symbols\sp4\dll\certadm.dbg
certcli.dbg\352bf2f1b000,\\mybuilds\symbols\sp4\dll\certcli.dbg
certcrpt.dbg\352bf04911000,\\mybuilds\symbols\sp4\dll\certcrpt.dbg
certenc.dbg\352bf2f7f000,\\mybuilds\symbols\sp4\dll\certenc.dbg

如果您使用 del transaction 復原原始 新增 交易,則會從server.txt移除這些行,並將下列這一行新增至history.txt:

0000000105,del,0000000096

刪除交易的欄位定義如下。

欄位 描述
0000000105 由 SymStore 建立的交易標識碼。
del 交易的類型。 此欄位可以是 adddel
0000000096 已刪除的交易。

 

符號 儲存體 格式

SymStore 會使用文件系統本身作為資料庫。 它會建立目錄的大型樹狀結構,並以符號檔時間戳、簽章、存留期和其他數據等專案為基礎的目錄名稱。

例如,將數個不同的 acpi.dbg 檔案新增至伺服器之後,目錄看起來可能會像這樣:

Directory of \\mybuilds\symsrv\acpi.dbg
10/06/1999  05:46p      <DIR>          .
10/06/1999  05:46p      <DIR>          ..
10/04/1999  01:54p      <DIR>          37cdb03962040
10/04/1999  01:49p      <DIR>          37cdb04027740
10/04/1999  12:56p      <DIR>          37e3eb1c62060
10/04/1999  12:51p      <DIR>          37e3ebcc27760
10/04/1999  12:45p      <DIR>          37ed151662060
10/04/1999  12:39p      <DIR>          37ed15dd27760
10/04/1999  11:33a      <DIR>          37f03ce962020
10/04/1999  11:21a      <DIR>          37f03cf7277c0
10/06/1999  05:38p      <DIR>          37fa7f00277e0
10/06/1999  05:46p      <DIR>          37fa7f01620a0

在此範例中,acpi.dbg 符號檔的查閱路徑可能看起來像這樣:\\mybuilds\symsrv\acpi.dbg\37cdb03962040。

查閱目錄中可能有三個檔案:

  1. 如果已儲存盤案,則 acpi.dbg 會存在該處。
  2. 如果已儲存指標,則名為 file.ptr 的檔案將會存在,並包含實際符號檔的路徑。
  3. 名為 refs.ptr 的檔案,其中包含 acpi.dbg 目前所有位置的清單,其中包含目前新增至符號存放區的時間戳和影像大小。

顯示 \\mybuilds\symsrv\acpi.dbg\37cdb03962040 的目錄列表提供下列專案:

10/04/1999  01:54p                  52 file.ptr
10/04/1999  01:54p                  67 refs.ptr

file.ptr 包含文字字串 “\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg”。 由於此目錄中沒有稱為 acpi.dbg 的檔案,調試程式會嘗試在 \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg 尋找檔案。

refs.ptr 的內容只能由 SymStore 使用,而不是調試程式。 此檔案包含此目錄中已發生之所有交易的記錄。 refs.ptr 的范例行可能是:

0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg

這會顯示 \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg 的指標已新增交易 “0000000026”。

某些符號檔會透過各種產品或組建或特定產品維持不變。 其中一個範例是 msvcrt.pdb 檔案。 執行 \\mybuilds\symsrv\msvcrt.pdb 目錄會顯示只有兩個版本的 msvcrt.pdb 已新增至符號伺服器:

Directory of \\mybuilds\symsrv\msvcrt.pdb
10/06/1999  05:37p      <DIR>          .
10/06/1999  05:37p      <DIR>          ..
10/04/1999  11:19a      <DIR>          37a8f40e2
10/06/1999  05:37p      <DIR>          37f2c2272

不過,執行 \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2 目錄會顯示 refs.ptr 有數個指標。

Directory of \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2
10/05/1999  02:50p              54     file.ptr
10/05/1999  02:50p           2,039     refs.ptr

\\mybuilds\symsrv\msvcrt.pdb\37a8f40e2\refs.ptr 的內容如下:

0000000001,ptr,\\mybuilds\symbols\x86\2137\symbols\dll\msvcrt.pdb
0000000002,ptr,\\mybuilds\symbols\x86\2137.chk\symbols\dll\msvcrt.pdb
0000000003,ptr,\\mybuilds\symbols\x86\2138\symbols\dll\msvcrt.pdb
0000000004,ptr,\\mybuilds\symbols\x86\2138.chk\symbols\dll\msvcrt.pdb
0000000005,ptr,\\mybuilds\symbols\x86\2139\symbols\dll\msvcrt.pdb
0000000006,ptr,\\mybuilds\symbols\x86\2139.chk\symbols\dll\msvcrt.pdb
0000000007,ptr,\\mybuilds\symbols\x86\2140\symbols\dll\msvcrt.pdb
0000000008,ptr,\\mybuilds\symbols\x86\2140.chk\symbols\dll\msvcrt.pdb
0000000009,ptr,\\mybuilds\symbols\x86\2136\symbols\dll\msvcrt.pdb
0000000010,ptr,\\mybuilds\symbols\x86\2136.chk\symbols\dll\msvcrt.pdb
0000000011,ptr,\\mybuilds\symbols\x86\2135\symbols\dll\msvcrt.pdb
0000000012,ptr,\\mybuilds\symbols\x86\2135.chk\symbols\dll\msvcrt.pdb
0000000013,ptr,\\mybuilds\symbols\x86\2134\symbols\dll\msvcrt.pdb
0000000014,ptr,\\mybuilds\symbols\x86\2134.chk\symbols\dll\msvcrt.pdb
0000000015,ptr,\\mybuilds\symbols\x86\2133\symbols\dll\msvcrt.pdb
0000000016,ptr,\\mybuilds\symbols\x86\2133.chk\symbols\dll\msvcrt.pdb
0000000017,ptr,\\mybuilds\symbols\x86\2132\symbols\dll\msvcrt.pdb
0000000018,ptr,\\mybuilds\symbols\x86\2132.chk\symbols\dll\msvcrt.pdb
0000000019,ptr,\\mybuilds\symbols\x86\2131\symbols\dll\msvcrt.pdb
0000000020,ptr,\\mybuilds\symbols\x86\2131.chk\symbols\dll\msvcrt.pdb
0000000021,ptr,\\mybuilds\symbols\x86\2130\symbols\dll\msvcrt.pdb
0000000022,ptr,\\mybuilds\symbols\x86\2130.chk\symbols\dll\msvcrt.pdb
0000000023,ptr,\\mybuilds\symbols\x86\2129\symbols\dll\msvcrt.pdb
0000000024,ptr,\\mybuilds\symbols\x86\2129.chk\symbols\dll\msvcrt.pdb
0000000025,ptr,\\mybuilds\symbols\x86\2128\symbols\dll\msvcrt.pdb
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\dll\msvcrt.pdb
0000000027,ptr,\\mybuilds\symbols\x86\2141\symbols\dll\msvcrt.pdb
0000000028,ptr,\\mybuilds\symbols\x86\2141.chk\symbols\dll\msvcrt.pdb
0000000029,ptr,\\mybuilds\symbols\x86\2142\symbols\dll\msvcrt.pdb
0000000030,ptr,\\mybuilds\symbols\x86\2142.chk\symbols\dll\msvcrt.pdb

這會顯示相同的 msvcrt.pdb 用於儲存在 \\mybuilds\symsrv 上的多個符號組建。

以下是包含檔案和指標新增混合的目錄範例:

Directory of E:\symsrv\dbghelp.dbg\38039ff439000
10/12/1999  01:54p         141,232     dbghelp.dbg
10/13/1999  04:57p              49     file.ptr
10/13/1999  04:57p             306     refs.ptr

在此情況下,refs.ptr 具有下列內容:

0000000043,file,e:\binaries\symbols\retail\dll\dbghelp.dbg
0000000044,file,f:\binaries\symbols\retail\dll\dbghelp.dbg
0000000045,file,g:\binaries\symbols\retail\dll\dbghelp.dbg
0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg

因此,交易 43、44 和 45 會將相同的檔案新增至伺服器,以及交易 46 和 47 新增指標。 如果刪除交易 43、44 和 45,則會從目錄中刪除 dbghelp.dbg 檔案。 目錄接著會有下列內容:

Directory of e:\symsrv\dbghelp.dbg\38039ff439000
10/13/1999  05:01p                   49 file.ptr
10/13/1999  05:01p                 130 refs.ptr

file.ptr 現在包含 “\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg”,而 refs.ptr 包含

0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg

每當 refs.ptr 中的最後一個專案是指針時,file.ptr 就會存在,並包含相關聯檔案的路徑。 每當 refs.ptr 中的最後一個項目是檔案時,此目錄中就不會有 file.ptr。 因此,移除 refs.ptr 中最後一個專案的任何刪除作業都可能導致建立、刪除或變更 file.ptr。