SymStore (symstore.exe) 是用于创建符号存储的工具。它被包含在Windows调试工具包中。
SymStore按照某种格式存储符号,使得调试器可以通过时间戳、映像大小(对于.dbg或可执行文件)、签名和寿命(.pdb文件)来查找符号。 使用符号存储而不是常规的符号存储格式的好处是,所有符号都可以在同一个服务器上进行存储或引用,而调试器不需要知道具有哪些产品对应的符号。
注意,不同版本的.pdb符号文件(例如共有和私有符号)不能保存在相同的符号服务器中,因为他们具有相同的签名和寿命。
SymStore事务
每个对SymStore的调用都被记录为事务。有两种不同的事务:添加和删除。
当创建符号存储时,一个称为"000admin"的目录会在服务器根目录下被创建。000admin 为每个事务都包含一个文件,和日志文件server.txt和history.txt一样。server.txt 文件包含当前服务器上的所有事务的列表。history.txt 文件包含所有历史事务,按时间排序。
每次SymStore存储或移除符号文件时,都会创建一个新的事务号。然后,一个以事务号为名字的文件会在000admin中创建。文件中包含所有在该事务中添加到符号存储的文件或指针地列表。如果某个事务被删除,SymStore会读取它的事务文件来决定哪些文件和指针需要删除。
add 和del 选项用来指定是否进行事务添加或删除。在添加操作中包含/p 选项表示添加一个指针;忽略掉/p指定添加实际的符号文件。
也可以通过分来的两个步骤来创建符号存储。第一步,使用SymStore 和/x 选项来创建一个索引文件。第二步,使用SymStore 和/y选项通过索引文件中的信息来实际的存储文件或指针。
由于各种原因,这是一种很有用的技术。例如,这样使得符号存储由于某些原因丢失的时候能够方便的重建,只要索引文件还存在。或者包含符号文件的计算机和创建符号存储的计算机之间网络连接速度很慢时。这种情况下,可以在符号文件所在机器上创建索引文件,并将该文件传输到第二台机器,在第二台机器上创建符号存储。
SymStore参数的完整列表,查看SymStore命令行选项。
注意 SymStore不支持多个用户同时发起事务。建议指派一个用户作为符号存储的"管理员"并处理所有的add 和del事务。
事务示例
这里有两个SymStore在\MyDirsymsrv 中添加Windows 2000 build 2195符号指针的示例:
symstore add /r /p /f \BuildServerBuildShare2195freesymbols*.* /s \MyDirsymsrv /t "Windows 2000" /v "Build 2195 x86 free" /c "Sample add"
symstore add /r /p /f \BuildServerBuildShare2195freesymbols*.* /s \MyDirsymsrv /t "Windows 2000" /v "Build 2195 x86 checked" /c "Sample add"
下面的示例中,SymStore将\largeappappserverins 中的项目的实际的符号文件添加到\MyDirsymsrv:
symstore add /r /f \largeappappserverins*.* /s \MyDirsymsrv /t "Large Application" /v "Build 432" /c "Sample add"
这是使用索引文件的示例。首先创建\largeappappserverins上的符号文件的索引文件。这种情况下,索引文件放在第三台计算机\hubserverhubshare上。 使用/g 选项来指定前缀"\largeappappserver"可能会在未来改变:
symstore add /r /p /g \largeappappserver /f \largeappappserverins*.* /x \hubserverhubsharemyindex.txt
假设现在将\largeappappserver 机器上的所有符号文件移动到\myarchiveappserver 上。可以使用如下方法从\hubserverhubsharemyindex.txt 上的索引文件创建符号存储本身:
symstore add /y \hubserverhubsharemyindex.txt /g \myarchiveappserver /s \MyDirsymsrv /p /t "Large Application" /v "Build 432" /c "Sample Add from Index"
最后,这是一个SymStore删除之前的事务中添加的文件的示例。查看后面的server.txt 和history.txt文件小节获得关于事务ID的说明。(本例中为0000000096)。
symstore del /i 0000000096 /s \MyDirsymsrv
压缩文件
SymStore可以使用两种方法使用压缩文件:
- 使用SymStore和/p选项来保存符号文件的指针。SymStore 完成之后,压缩指针指向的文件。
- 使用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 NT 4.0 SP 4,x86 fre 1.156c-RTM-2,Added from \mybuildssymbols,
这是用逗号分隔的行。下面是每个部分的说明:
字段 | 说明 |
---|---|
0000000096 | 事务ID号,由SymStore创建 |
add | 事务类型,这个字段可以是add或del。 |
ptr | 添加的是文件或指针。该字段可以是file或ptr。 |
10/09/99 | 事务发生的日期。 |
00:08:32 | 事务开始的时间。 |
Windows NT | 产品 |
x86 fre | 版本(可选)。 |
Added from | 注释(可选)。 |
Unused | (保留为以后使用)。 |
这是事务文件0000000096中的一些示例行。每行都记录了添加到目录中的文件或指针的目录和位置。
canon800.dbg35d9fd51b000,\mybuildssymbolssp4dllcanon800.dbg
canonlbp.dbg35d9fd521c000,\mybuildssymbolssp4dllcanonlbp.dbg
certadm.dbg352bf2f48000,\mybuildssymbolssp4dllcertadm.dbg
certcli.dbg352bf2f1b000,\mybuildssymbolssp4dllcertcli.dbg
certcrpt.dbg352bf04911000,\mybuildssymbolssp4dllcertcrpt.dbg
certenc.dbg352bf2f7f000,\mybuildssymbolssp4dllcertenc.dbg
如果使用del事务来撤销以前的add事务,这些行会从server.txt中删除,并添加下面这行到history.txt中:
0000000105,del,0000000096
删除事务的字段说明如下。
字段 | 说明 |
---|---|
0000000105 | 事务ID号,SymStore创建。 |
del | 事务类型。该字段可以是add或del。 |
0000000096 | 被删除的事务。 |
符号存储格式
SymStore使用文件系统本身作为数据库。它创建一个大的目录树,目录名基于符号文件的时间戳、签名、寿命和其他数据。
例如一些不同的acpi.dbg添加到服务器之后,目录可能像下面一样:
Directory of \mybuildssymsrvacpi.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的查找路径可能像这样:\mybuildssymsrvacpi.dbg37cdb03962040。
在查找目录中可能有三个文件:
- acpi.dbg,如果保存了该文件的话
- 如果保存的是指针,file.ptr 包含实际的符号文件路径。
- refs.ptr,包含当前被添加到符号存储中的,具有该时间戳和映像大小的acpi.dbg的当前位置的完整列表。
显示\mybuildssymsrvacpi.dbg37cdb03962040 中的目录列表如下:
10/04/1999 01:54p 52 file.ptr
10/04/1999 01:54p 67 refs.ptr
file.ptr 文件包含字符串"\mybuildssymbolsx862128.chksymbolssysacpi.dbg"。因为该目录中没有acpi.dbg 文件,所以调试器会试图从\mybuildssymbolsx862128.chksymbolssysacpi.dbg中去查找。
refs.ptr 中的内容仅被SymStore使用,而不会被调试器使用。这个文件记录该目录中发生过的所有事务的记录。refs.ptr 中的一个示例行可能像这样:
0000000026,ptr,\mybuildssymbolsx862128.chksymbolssysacpi.dbg
这表明指向\mybuildssymbolsx862128.chksymbolssysacpi.dbg 的指针由事务"0000000026"添加。
一些符号文件在各种产品、版本或特殊产品中保持不变。这样的一个例子是Windows 2000的文件msvcrt.pdb。列举\mybuildssymsrvmsvcrt.pdb 目录显示只有两个版本的msvcrt.pdb 被添加到了符号服务器上:
Directory of \mybuildssymsrvmsvcrt.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
但是,列举\mybuildssymsrvmsvcrt.pdb37a8f40e2 目录表明refs.ptr 中有一些指针。
Directory of \mybuildssymsrvmsvcrt.pdb37a8f40e2
10/05/1999 02:50p 54 file.ptr
10/05/1999 02:50p 2,039 refs.ptr
\mybuildssymsrvmsvcrt.pdb37a8f40e2 efs.ptr的内容如下:
0000000001,ptr,\mybuildssymbolsx862137symbolsdllmsvcrt.pdb
0000000002,ptr,\mybuildssymbolsx862137.chksymbolsdllmsvcrt.pdb
0000000003,ptr,\mybuildssymbolsx862138symbolsdllmsvcrt.pdb
0000000004,ptr,\mybuildssymbolsx862138.chksymbolsdllmsvcrt.pdb
0000000005,ptr,\mybuildssymbolsx862139symbolsdllmsvcrt.pdb
0000000006,ptr,\mybuildssymbolsx862139.chksymbolsdllmsvcrt.pdb
0000000007,ptr,\mybuildssymbolsx862140symbolsdllmsvcrt.pdb
0000000008,ptr,\mybuildssymbolsx862140.chksymbolsdllmsvcrt.pdb
0000000009,ptr,\mybuildssymbolsx862136symbolsdllmsvcrt.pdb
0000000010,ptr,\mybuildssymbolsx862136.chksymbolsdllmsvcrt.pdb
0000000011,ptr,\mybuildssymbolsx862135symbolsdllmsvcrt.pdb
0000000012,ptr,\mybuildssymbolsx862135.chksymbolsdllmsvcrt.pdb
0000000013,ptr,\mybuildssymbolsx862134symbolsdllmsvcrt.pdb
0000000014,ptr,\mybuildssymbolsx862134.chksymbolsdllmsvcrt.pdb
0000000015,ptr,\mybuildssymbolsx862133symbolsdllmsvcrt.pdb
0000000016,ptr,\mybuildssymbolsx862133.chksymbolsdllmsvcrt.pdb
0000000017,ptr,\mybuildssymbolsx862132symbolsdllmsvcrt.pdb
0000000018,ptr,\mybuildssymbolsx862132.chksymbolsdllmsvcrt.pdb
0000000019,ptr,\mybuildssymbolsx862131symbolsdllmsvcrt.pdb
0000000020,ptr,\mybuildssymbolsx862131.chksymbolsdllmsvcrt.pdb
0000000021,ptr,\mybuildssymbolsx862130symbolsdllmsvcrt.pdb
0000000022,ptr,\mybuildssymbolsx862130.chksymbolsdllmsvcrt.pdb
0000000023,ptr,\mybuildssymbolsx862129symbolsdllmsvcrt.pdb
0000000024,ptr,\mybuildssymbolsx862129.chksymbolsdllmsvcrt.pdb
0000000025,ptr,\mybuildssymbolsx862128symbolsdllmsvcrt.pdb
0000000026,ptr,\mybuildssymbolsx862128.chksymbolsdllmsvcrt.pdb
0000000027,ptr,\mybuildssymbolsx862141symbolsdllmsvcrt.pdb
0000000028,ptr,\mybuildssymbolsx862141.chksymbolsdllmsvcrt.pdb
0000000029,ptr,\mybuildssymbolsx862142symbolsdllmsvcrt.pdb
0000000030,ptr,\mybuildssymbolsx862142.chksymbolsdllmsvcrt.pdb
这表明相同的msvcrt.pdb 在保存在\mybuildssymsrv 上的几个Windows 2000符号版本中都使用了。
这是同时包含了文件和附加指针的目录示例:
Directory of E:symsrvdbghelp.dbg38039ff439000
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:inariessymbols
etaildlldbghelp.dbg
0000000044,file,f:inariessymbols
etaildlldbghelp.dbg
0000000045,file,g:inariessymbols
etaildlldbghelp.dbg
0000000046,ptr,\MyDirinsymbols
etaildlldbghelp.dbg
0000000047,ptr,\foo2insymbols
etaildlldbghelp.dbg
这样,事务43、44和45向服务器添加了同样的文件,事务46和47添加了指针。如果事务43、44和45被删除,dbghelp.dbg 文件也会从目录中删除掉。这时,目录具有如下内容:
Directory of e:symsrvdbghelp.dbg38039ff439000
10/13/1999 05:01p 49 file.ptr
10/13/1999 05:01p 130 refs.ptr
新的file.ptr 包含"\foo2insymbols etaildlldbghelp.dbg",而refs.ptr 包含:
0000000046,ptr,\MyDirinsymbols
etaildlldbghelp.dbg
0000000047,ptr,\foo2insymbols
etaildlldbghelp.dbg
只要refs.ptr 的最后一项为指针,就会存在file.ptr文件,并且包含相关文件的路径。当refs.ptr 最后一项为文件时,目录中不会存在file.ptr。因此,任何对refs.ptr中最后一项的删除操作都可能使得file.ptr 被创建、删除或修改。
SymStore命令行选项
SymStore 事务支持下面这些语法形式。第一个参数必须是add 或del。 其他参数的顺序不重要。
symstore add [/r] [/p [/l] [-:MSG Message] [-:REL] [-:NOREFS]] /f File /s Store /t Product [/v Version] [/o] [/c Comment] [/d LogFile] [/compress]
symstore add [/r] [/p [/l] [-:REL] [-:NOREFS]] /g Share /f File /x IndexFile [/a] [/o] [/d LogFile]
symstore add /y IndexFile /g Share /s Store [/p [-:MSG Message] [-:REL] [-:NOREFS]] /t Product [/v Version] [/o] [/c Comment] [/d LogFile] [/compress]
symstore query [/r] /f File /s Store [/o] [/d LogFile]
symstore del /i ID /s Store [/o] [/d LogFile]
symstore /?
参数
- /f File
- 指定要添加的文件或目录的网络路径。
- /g Share
- 指定符号文件本来存储的服务器和共享。当使用/f时,Share 应该和File 指示符的开头相同。使用/y 时,Share 应该是原始符号文件的位置(不是索引文件)。这使得之后将符号文件移动到不同的服务器和共享时可以改变文件路径的一部分。
- /s Store
- 指定符号存储的根目录。
- /m Prefix
- 使得SymStore在存储文件或升级指针时使用以Prefix开始的路径来使用符号。该选项不能和/x一起使用。
- /h { PUB | PRI }
- 使得SymStore在存储或升级符号时使用共有符号(如果指定了PUB),或私有符号(如果指定了PRI)。该选项对二进制文件没有影响。
- /i ID
- 指定事务ID字符串。
- /p
- 使得SymStore存储文件的指针,而不是文件本身。
- /l
- 允许File 指定的文件在本地目录中而不是网络路径。(该选项仅在同时使用/f 和/p时使用。)
- -:MSG Message
- 将指定的Message 添加到每个文件。(仅在使用/p时可以使用。)
- -:REL
- 允许文件指针中的路径是相对路径。该选项隐含/l选项。(仅在使用/p时可以使用。)
- -:NOREFS
- 省略被存储的文件和指针的引用指针文件的创建。如果被修改的存储是使用该选项创建的,那么这个选项仅在符号存储最初被创建时有效。
- /r
- 使得SymStore递归的添加文件或目录。
- /t Product
- 指定产品名字。
- /v Version
- 指定产品的版本。
- /c Comment
- 为事务指定一个注释。
- /d LogFile
- 指定一个用于命令输出的日志文件。如果没有指定它,则事务信息和其他输出被发送给stdout。
- /o
- 使得SymStore显示详细输出。
- /x IndexFile
- 使得SymStore不存储实际的符号文件。作为替代,SymStore记录IndexFile 中的信息,使得SymStore可以在之后再访问符号文件。
- /a
- 让SymStore将新的索引信息添加到一个已存在的索引文件中。(该选项只和/x 一起使用。)
- /y IndexFile
- 让SymStore从使用/x 创建的文件中读取数据。
- /yi IndexFile
- 将事务ID和注释添加到由/x选项创建的索引文件末尾。
- /z { PUB | PRI }
- 使得SymStore仅索引指定类型的符号。指定PUB时,仅有不包含任何源码信息的符号会被索引。如果指定PRI,仅有包含完整的源码信息的符号会被索引。SymStore总是为二进制符号创建索引。
- /compress
- 使得SymStore为每个拷贝到符号存储中的文件创建一个压缩后的版本而不是使用未压缩的文件。该选项仅在存储文件而不是指针时使用,所以不能和/p选项一起使用。
- /?
- 显示SymStore 命令的帮助文本。
其他信息
关于SymStore 的更多信息,查看使用符号服务器和符号存储。