NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----32

cc682/NetRoc

http://netroc682.spaces.live.com/

使用符号服务器和符号存储

要正确地设置符号是一件有挑战性的工作,特别是对于内核调试。这经常需要知道计算机上所有产品的名字和版本。调试器必须能定位每个产品和Service pack对应的符号文件。

如果目录列表很长,可能产生非常长的符号路径。

要想简单的整理这些符号文件,可以使用符号服务器。符号服务器使得调试器可以在不需要产品名字、版本或build号的情况下自动获得正确的符号文件。Windows调试工具包包含的符号服务器称为SymSrv

符号服务器通过在符号路径中包含特定的文本来使用。每次调试器需要为新加载的模块加载符号时,都会调用符号服务器来定位适合的符号文件。符号服务器在符号存储中定位这些文件。这是符号文件的集合,管理员可以使用索引和工具来添加和删除文件。文件通过例如时间戳和映像大小这样的唯一参数来进行索引。Windows调试工具包包含一个称为SymStore的符号存储。

本节包含:

使用Symsrv

使用其它符号服务器

使用SymStore

使用其它符号存储

使用SymSrv

SymSrv (symsrv.dll)是一个包含在Windows调试工具包中的符号服务器。

很多Windows调试工具包的用户使用Microsoft网站上的公用符号存储来访问Microsoft产品的符号。如果采用这种方法,只需要阅读下面列出的第一个主题。

本节包含:

Microsoft公共符号

SymSrv高级使用方式

防火墙和代理服务器

Microsoft公共符号

Microsoft有一个网站用于公开的访问Windows符号。可以使用下面的方式在符号路径中直接引用这个站点:

set _NT_SYMBOL_PATH=srv*DownstreamStore*http://msdl.microsoft.com/download/symbols

DownstreamStore 必须指定本地计算机或网络上的其它计算机用来缓存符号的目录。符号缓存(downstream store)保存调试器曾访问过的符号; 而绝大多数未曾访问过的符号仍然保存在Microsoft的符号存储。这使得符号缓存相对较小,而每个文件仅下载一次使得符号服务器可以快速工作。

要避免键入很长的符号路径,可以使用.symfix (Set Symbol Store Path)命令。下面的命令将公共符号存储加入到现有的符号路径中:

.symfix+ DownstreamStore 

注意  要成功访问Microsoft公共符号存储,需要快速的internet连接。如果internet连接仅有56 Kps或更低,最好将Windows符号直接安装在硬盘中。详细信息,查看 安装Windows符号文件

关于公共符号存储的更多信息,查看Windows Symbols网站。

SymSrv 的高级使用方式

SymSrv可以从一个集中的符号存储来交付符号文件。该存储可以包含对应于任意多个程序或操作系统的任意数量的符号文件。也可以包含二进制文件(这在调试小转储(minidumps)文件时非常有用)。

符号存储可以包含实际的符号和二进制文件,也可以仅包含符号文件的指针。这时,SymSrv会从它们的源直接获得实际的文件。

SymSrv也可以用来将大的符号存储分割为适合各种不同调试任务的小的子集。

最后,SymSrv可以使用操作系统提供的登陆信息从HTTP或HTTPS源获得符号文件。SymSrv支持由智能卡(smartcards)、证书、常规登陆和密码(regular logins and passwords)保护的HTTPS站点。

设置符号路径

要使用符号服务器,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

指定符号缓存。这是用于缓存各个符号文件的本地或网络共享目录。

可以指定多于一个的缓存,以星号分开。多个缓存的情况在本页后面的层叠符号缓中描述。

如果在一般用于指定符号缓存的行中包含两个星号,则使用默认的符号缓存。这是位于主目录下的sym子目录。主目录默认是调试器的安装目录;但是可以通过!homedir扩展命令改变。

如果DownstreamStore 指定的是不存在的目录,SymStore会尝试创建它。

如果DownstreamStore 参数省略,并且没有包含其它的星号——即srv加上一个星号或者symsrv加上两个星号——则不会创建符号缓存。调试器会直接从服务器加载符号文件,而不会在本地进行缓存。

注意  如果从HTTP或HTTPS站点访问符号,或符号存储使用压缩文件,则总是会使用符号缓存。如果没有指定符号缓存,在主目录下的sym子目录中会创建一个。

\\Server\Share

指定服务器和远程符号存储的共享。

如果使用了符号缓存,调试器首先会在里面查找符号文件。在没有找到的情况下,调试器才从指定的服务器共享中定位符号文件,然后在符号缓存中保存一个副本。文件副本会保存在DownstreamStore 下和\\Server\Share目录树对应的子目录中。

符号服务器不一定要是符号路径中的唯一入口。如果符号路径包含多个入口,调试器会按照它们出现的顺序(从左到右)来查找需要的符号文件,不管它是符号服务器或者真实的目录。

这里有一些示例。要使用SymSrv和\\mybuilds\mysymbols上的符号存储一起作为符号服务器,设置如下的符号路径:

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

要让调试器从\\mybuilds\mysymbols 上的符号存储获得符号文件并保存到本地目录c:\localsymbols中,使用:

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

设置符号路径使得调试器从HTTP站点www.company.com/manysymbols 上获得符号并保存到本地网络目录\\localserver\myshare\mycache上,使用:

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

最后一个示例是使用缩写形式:

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

另外,符号路径中可以包含用分号分隔的多个目录或符号服务器。这使得可以从多个位置(或多个符号服务器)定位符号。如果某个二进制文件有一个不匹配的符号文件,则调试器不能再符号服务器中定位它,因为只检查精确的参数。但是,使用传统的符号路径,调试器可能找到名字对应但是不匹配的符号文件并成功加载。即使该文件从技术上来说是不正确的,但是还是可能提供一些有用信息。

压缩文件

SymSrv 兼容包含压缩文件的符号存储,只要这些文件是使用随Microsoft Windows SDK发布的 compress.exe 工具压缩的。压缩文件的文件扩展名末尾应该是一个下划线 (如module1.pd_module2.db_)。详细信息,查看使用SymStore

如果存储中的文件是压缩的,必须使用符号缓存。SymSrv将他们缓存之前会进行解压。

删除缓存

如果使用DownstreamStore 作为缓存,在任何时候都可以删除该目录来获得磁盘空间。

可能会有保存了很多不同程序和Windows版本的巨大的符号存储。如果升级了目标机上使用的Windows版本,可能这些缓存的符号都是匹配旧版本的。这些符号以后都不会再使用,所以这时正好可以删除缓存。

层叠符号缓存

可以指定任意多个用星号分开的符号缓存。它们称为层叠符号存储

在开始的srv*symsrv*ServerDLL*之后,每个标记都指示了一个符号位置。最左边的会首先被检查。空的标记——用一行中的两个星号,或者在字符串末尾的一个星号标识——指定使用默认的符号缓存。

这里有一个符号路径的例子,使用两个符号缓存来保存从主符号存储访问过的信息。它们可以称为主存储、中间存储(mid-level store)和本地缓存:

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

这种情况下,SymSrv首先在c:\localcache 中查找符号文件。如果找到了,它返回这里的一个路径。如果没找到,则继续查找\\interim\store。如果在这里找到了符号文件,SymSrv将它复制到 c:\localcache 并返回路径。如果没找到, SymSrv将在http://msdl.microsoft.com/download/symbols 上的Microsoft公共符号存储中寻找;如果找到了,SymSrv会将它同时复制到\\interim\storec:\localcache

使用下面的符号路径时有类似效果:

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

这种情况下,本地缓存是默认的符号缓存,并且主存储是一个intetnet网站。中间存储指定为\\interim\store

当SymSrv 处理包含层叠存储的路径时,它会跳过任何不能读写的缓存。所以如果共享被关闭了,它会将文件通过丢失的存储复制到缓存中而不产生任何错误。这样的一个好处是,当主存储不可写的时候,可以指定多个主存储作为单个下游存储的源。

当从主存储获得压缩过的符号文件时,任何中间存储中保存的都是压缩形式的文件。只有路径中最底部的存储中会保存解压后的文件。

cache*localsymbolcache

另一种为符号创建本地缓存的方法是在符号路径中使用cache*localsymbolcache 字符串。这不是符号服务器部件的一部分,而是符号路径中的另一种部件。调试器将把从符号路径中在该字符串右边的任何部分访问到的符号保存到localsymbolcache 指定的目录中。这使得从任何位置访问过的符号都可以进行本地缓存,而不仅是从符号服务器访问的那些。

例如,下面的符号路径不会缓存从\\someshare 中获取的符号。从\\anothershare 中获取的符号会保存到c:\mysymbols 中,因为它出现在cache*c:\mysymbols 的右边。同样,从Microsoft公共符号存储中获得的符号也会保存到c:\mysymbols ,因为使用了符号服务器的常用语法 (srv 和两个或更多星号)。 此外,如果之后再使用.sympath+ 命令来向路径中添加其它位置,这些新的部分也会被缓存,因为他们都会被添加到符号路径的右边。

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

SymSrv 如何定位文件

SymSrv会为需要的符号文件创建一个完全限定的UNC路径(fully-qualified UNC path)。 这个路径以_NT_SYMBOL_PATH 环境变量中指定的指向符号存储的路径开头。SymbolServer 的函数之后用来确定该文件的名字;这个名字会加在路径上作为目录名。传递给SymbolServerid、第2、3个参数会串起来组成另一个目录名加到路径上。如果这些值中有为0的,则会被忽略掉。

最后产生的目录会用来搜索符号文件或符号存储的指针文件。

如果搜索成功,SymbolServer 将路径传递给调用者并返回TRUE。如果没有找到,SymbolServer 返回FALSE。

使用AgeStore来控制缓存大小

AgeStore 工具可以用来删除缓存中早于指定时间的文件,或者将缓存大小控制在指定值以下。这在符号缓存太大的时候很有用。更详细的信息,查看AgeStore

posted on 2008-05-22 15:31 NetRoc 阅读(691) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜