Debugging Tools for Windows |
SymSrv可以从一个集中的符号存储来交付符号文件。该存储可以包含对应于任意多个程序或操作系统的任意数量的符号文件。也可以包含二进制文件(这在调试小转储(minidumps)文件时非常有用)。
符号存储可以包含实际的符号和二进制文件,也可以仅包含符号文件的指针。这时,SymSrv会从它们的源直接获得实际的文件。
SymSrv也可以用来将大的符号存储分割为适合各种不同调试任务的小的子集。
最后,SymSrv可以使用操作系统提供的登陆信息从HTTP或HTTPS源获得符号文件。SymSrv支持由智能卡(smartcards)、证书、常规登陆和密码(regular logins and passwords)保护的HTTPS站点。更多信息,查看HTTP 符号存储。
要使用符号服务器,symsrv.dll必须和调试器安装在同一个目录下。必须按下面的方法之一设置符号路径:
set _NT_SYMBOL_PATH = symsrv*ServerDLL*\\Server\Share
set _NT_SYMBOL_PATH = srv*DownstreamStore*\\Server\Share
set _NT_SYMBOL_PATH = srv*\\Server\Share
语法中的各部分说明如下:
可以指定多于一个的下游存储,以星号分开。多个缓存的情况在本页后面的层叠下游存储中描述。
如果在一般用于指定下游存储的行中包含两个星号,则使用默认的下游存储。这是位于主目录下的sym子目录。主目录默认是调试器的安装目录;但是可以通过!homedir扩展命令或者设置DBGHELP_HOMEDIR环境变量改变。
如果DownstreamStore 指定的是不存在的目录,SymStore会尝试创建它。
如果DownstreamStore 参数省略,并且没有包含其它的星号 — 即srv加上一个星号或者symsrv加上两个星号 — 则不会创建下游存储。调试器会直接从服务器加载符号文件,而不会在本地进行缓存
注意 如果从HTTP或HTTPS站点访问符号,或符号存储使用压缩文件,则总是会使用符号缓存。如果没有指定下游存储,在主目录下的sym子目录中会创建一个。
指定服务器和远程符号存储的共享。
如果使用了下游存储,调试器首先会在里面查找符号文件。在没有找到的情况下,调试器才从指定的服务器和共享中定位符号文件,然后在下游存储中保存一个副本。文件副本会保存在DownstreamStore 下和\\Server\Share目录树对应的子目录中。
符号服务器不一定要是符号路径中的唯一的内容。如果符号路径包含多个条目,调试器会按照它们出现的顺序(从左到右)来查找需要的符号文件,不管它是符号服务器或者真实的目录。
这里有一些示例。要使用SymSrv和\\mybuilds\mysymbols上的符号存储一起作为符号服务器,设置如下的符号路径:
要让调试器从\\mybuilds\mysymbols 上的符号存储获得符号文件并保存到本地目录c:\localsymbols中,使用:
设置符号路径使得调试器从HTTP站点www.company.com/manysymbols 上获得符号并保存到本地网络目录\\localserver\myshare\mycache上,使用:
最后一个示例是使用缩写形式
另外,符号路径中可以包含用分号分隔的多个目录或符号服务器。这使得可以从多个位置(或多个符号服务器)定位符号。如果某个二进制文件有一个不匹配的符号文件,则调试器不能再符号服务器中定位它,因为只检查精确的参数。但是,使用传统的符号路径,调试器可能找到名字对应但是不匹配的符号文件并成功加载。即使该文件从技术上来说是不正确的,但是还是可能提供一些有用信息。
SymSrv 兼容包含压缩文件的符号存储,只要这些文件是使用随Microsoft Windows SDK发布的 compress.exe 工具压缩的。压缩文件的文件扩展名末尾应该是一个下划线 (如module1.pd_ 或module2.db_)。详细信息,查看使用SymStore。
如果存储中的文件是压缩的,则必须使用下游存储。SymSrv将他们缓存之前会进行解压。
如果使用DownstreamStore 作为缓存,在任何时候都可以删除该目录来获得磁盘空间。
可能会有保存了很多不同程序和Windows版本的巨大的符号存储。如果升级了目标机上使用的Windows版本,可能这些缓存的符号都是匹配旧版本的。这些符号以后都不会再使用,所以这时正好可以删除缓存。
可以指定任意多个用星号分开的下游存储。它们称为层叠下游存储。
在开始的srv* 或symsrv*ServerDLL*之后,每个标记都指示了一个符号位置。最左边的会首先被检查。空的标记 — 用一行中的两个星号,或者在字符串末尾的一个星号标识 — 指定使用默认的下游存储。
这里有一个符号路径的例子,使用两个下游存储来保存从主符号存储访问过的信息。它们可以称为主存储、中间存储(mid-level store)和本地缓存:
这种情况下,SymSrv首先在c:\localcache 中查找符号文件。如果找到了,它返回这里的一个路径。如果没找到,则继续查找\\interim\store。如果在这里找到了符号文件,SymSrv将它复制到 c:\localcache 并返回路径。如果没找到, SymSrv将在http://msdl.microsoft.com/download/symbols 上的Microsoft 公共符号存储中寻找;如果找到了,SymSrv会将它同时复制到\\interim\store 和c:\localcache。
使用下面的符号路径时有类似效果:
这种情况下,本地缓存是默认的下游存储,并且主存储是一个intetnet网站。中间存储指定为\\interim\store。
当SymSrv 处理包含层叠存储的路径时,它会跳过任何不能读写的缓存。所以如果共享被关闭了,它会将文件通过丢失的存储复制到缓存中而不产生任何错误。这样的一个好处是,当主存储不可写的时候,可以指定多个主存储作为单个下游存储的源。
当从主存储获得压缩过的符号文件时,任何中间存储中保存的都是压缩形式的文件。只有路径中最底部的存储中会保存解压后的文件。
另一种为符号创建本地缓存的方法是在符号路径中使用cache*localsymbolcache 字符串。这不是符号服务器部件的一部分,而是符号路径中的另一种部件。调试器将把从符号路径中在该字符串右边的任何部分访问到的符号保存到localsymbolcache 指定的目录中。这使得从任何位置访问过的符号都可以进行本地缓存,而不仅是从符号服务器访问的那些。
例如,下面的符号路径不会缓存从\\someshare 中获取的符号。从\\anothershare 中获取的符号会保存到c:\mysymbols 中,因为它出现在cache*c:\mysymbols 的右边。同样,从Microsoft公共符号存储中获得的符号也会保存到c:\mysymbols ,因为使用了符号服务器的常用语法 (srv 和两个或更多星号)。 此外,如果之后再使用.sympath+ 命令来向路径中添加其它位置,这些新的部分也会被缓存,因为他们都会被添加到符号路径的右边。
SymSrv会为需要的符号文件创建一个完全限定的UNC路径(fully-qualified UNC path)。 这个路径以_NT_SYMBOL_PATH 环境变量中指定的指向符号存储的路径开头。SymbolServer 的函数之后用来确定该文件的名字;这个名字会加在路径上作为目录名。传递给SymbolServer的id、第2、3个参数会串起来组成另一个目录名加到路径上。如果这些值中有为0的,则会被忽略掉。
最后产生的目录会用来搜索符号文件或符号存储的指针文件。
如果搜索成功,SymbolServer 将路径传递给调用者并返回TRUE。如果没有找到,SymbolServer 返回FALSE。
AgeStore 工具可以用来删除缓存中早于指定时间的文件,或者将缓存大小控制在指定值以下。这在符号缓存太大的时候很有用。更详细的信息,查看AgeStore。