使用 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 不支持来自多个用户的同时事务。 建议将一个用户指定为符号存储的“管理员”,并且该用户负责所有 adddel 事务。

 

事务示例

以下是 SymStore 将 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 删除先前事务添加的文件的示例。 有关如何确定事务 ID(在本例中为 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 创建的事务 ID 号。
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 事务撤消原始 add 事务,则将从 server.txt 中删除这些行,并会将以下行添加到 history.txt 中:

0000000105,del,0000000096

删除事务的字段定义如下。

字段 说明
0000000105 由 SymStore 创建的事务 ID 号。
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

这表明已通过事务“0000000026”添加了一个指向 \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg 的指针。

某些符号文件在各种产品、内部版本或特定产品中保持不变。 其中一个示例是 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。