NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----34

cc682/NetRoc

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

使用源码服务器

SrcSrv (srcsrv.dll)是一个以和符号服务器SymSrv类似的方式工作的源码服务器。它是Windows调试工具包的一部分。

要使用源码服务器,调试的二进制文件必须按源码进行索引。当二进制文件在构建时已经被索引,并且源码文件位置包含在PDB文件中时,调试器可以自动寻找到适合的源文件。

在调试器中使用SrcSrv

SrcSrv可以在WinDbg、KD、NTSD或CDB中使用。

要在调试器中使用源码服务器,只需要在源码路径中简单的包含SRV* 文本。关于控制该路径的详细信息,查看源码路径。例如:

.srcpath srv*;c:\mysource

这个例子中也包含一个传统的源码路径成员。SrcSrv可以和本地源码路径一起使用。不管SRV*出现在开头还是后面,源码服务器总是在其他路径之前被搜索。如果SrcSrv不能访问或者找不到源文件,调试器会搜索其他路径。

任何从源码服务器下载的源文件在调试会话结束之后,都会保存在硬盘中。这很类似于符号服务器的流式存储(即downstream store,貌似这样翻译比较贴切一点)功能。源文件在本地被保存到主目录的src子目录中。默认的主目录是调试器的安装目录;但是可以通过!homedir 扩展命令修改。如果该子目录不存在,则会自动被创建。

如果使用.open (Open Source File)命令来通过SrcSrv打开新的源文件,必须包含-m Address 参数。

使用SgeStore来控制缓存大小

AgeStore和源码服务器一起工作的方式和与符号服务器一起的时候完全一样:它可以删除比指定日期早的缓存文件,或者将缓存内容的大小控制到指定值之下。这在流式存储(downstream store)变得过大时非常有用。详细信息查看AgeStore

源码索引

关于如何索引源码的信息,查看srcsrv.doc中的文档。该文档和SrcSrv本身一样,是Windows调试工具包的一部分。必须进行自定义安装才能获得该文件,查看调试器安装获得详细信息。

延迟符号加载

默认情况下,目标模块加载时并没有实际加载符号信息。符号是在调试器需要使用时才加载的。这称为延迟符号加载(deferred symbol loadinglazy symbol loading)。当该选项启用时,调试器在遇到不认识的符号时才会进行符号加载。

当延迟符号加载被禁用是,进程的启动可能变得慢很多,因为所有符号在模块加载时就会被加载起来。

在WinDbg中,对于没有模块前缀的符号,延迟符号加载的特性可以使用Debug菜单的Resolve Unqualified Symbols选项来更改。

通过使用ld (Load Symbols) 命令或.reload (Reload Module)命令和/f选项,可以忽略延迟符号加载 。他们强制指定符号被立即加载起来,即使其他符号的加载是延迟的。如果符号路径改变了,符号不会自动重新加载。

默认情况下,延迟符号加载是启用的。在CDB和KD中, -s 命令行选项可以关掉它。在CDB中也可以通过tools.ini 文件的LazyLoad选项来关掉。当调试器运行起来之后,可以通过.symopt+0x4.symopt-0x4命令来打开或关闭。

设置符号选项

有很多选项用于控制符号如何被加载和使用。这些选项可以通过各种办法设置。

下表列出了这些符号选项:

标志

选项名

调试器的默认值

DBH的默认值

0x1

SYMOPT_CASE_INSENSITIVE

On

On

0x2

SYMOPT_UNDNAME

On

On

0x4

SYMOPT_DEFERRED_LOADS

On

Off

0x8

SYMOPT_NO_CPP

Off

Off

0x10

SYMOPT_LOAD_LINES

KD和CDB中为Off

WinDbg 中为On

On

0x20

SYMOPT_OMAP_FIND_NEAREST

On

Off

0x40

SYMOPT_LOAD_ANYTHING

Off

Off

0x80

SYMOPT_IGNORE_CVREC

Off

Off

0x100

SYMOPT_NO_UNQUALIFIED_LOADS

Off

Off

0x200

SYMOPT_FAIL_CRITICAL_ERRORS

On

Off

0x400

SYMOPT_EXACT_SYMBOLS

Off

On

0x800

SYMOPT_ALLOW_ABSOLUTE_SYMBOLS

Off

On

0x1000

SYMOPT_IGNORE_NT_SYMPATH

Off

Off

0x2000

SYMOPT_INCLUDE_32BIT_MODULES

Off

Off

0x4000

SYMOPT_PUBLICS_ONLY

Off

Off

0x8000

SYMOPT_NO_PUBLICS

Off

Off

0x10000

SYMOPT_AUTO_PUBLICS

On

On

0x20000

SYMOPT_NO_IMAGE_SEARCH

On

Off

0x40000

SYMOPT_SECURE

Off

Off

0x80000

SYMOPT_NO_PROMPTS

KD和CDB中为On

WinDbg 中为Off

Off

0x80000000

SYMOPT_DEBUG

Off

Off

 

改变符号选项的设置

.symopt (Set Symbol Options)命令可以用来修改或显示符号选项的设置。另外,很多命令行参数和命令也可以修改这些设置;他们分别在SYMOPT_XXX 节中列出。

也可以在-sflags 命令行选项中一次控制所有设置。 该选项可以后跟一个10进制数字或带0x前缀的16进制数字。建议使用16进制数,因为这些符号标志也是按这样排列的。注意使用这种方法时,由于设置了所有位,所以所有符号设置都会被覆盖掉。例如,-sflags 0x401不单是打开SYMOPT_EXACT_SYMBOLS 和SYMOPT_CASE_INSENSITIVE ,还会将其他默认打开的选项全部关闭!

当程序以不带任何符号相关的命令行选项启动时,所有标志位的默认值在WinDbg中为0x30237,在CDB和KD中为0xB0227,在DBH工具中为0x10C13。

SYMOPT_CASE_INSENSITIVE

该选项使得所有对符号名的搜索区分大小写。

所有调试器中该选项默认打开。调试器运行之后,可以通过.symopt+0x1.symopt-0x1打开或关闭。

DBH中该选项默认打开。DBH运行时,可以通过symopt +1symopt -1来打开或关闭。

SYMOPT_UNDNAME

该选项使得公有符号名被显示或搜索时都忽略修饰符。私有符号不管该选项是否激活都永远不会被修饰。关于符号名修饰符的更多信息,查看公有和私有符号

所有调试器中该选项默认打开。调试器运行后,可以通过.symopt+0x2.symopt-0x2打开或关闭。

DBH中该选项默认打开。可以通过-d命令行选项关闭。DBH运行时,可以通过symopt +2symopt -2打开或关闭。

SYMOPT_DEFERRED_LOADS

该选项称为延迟符号加载(deferred symbol loadinglazy symbol loading)。激活时,当目标模块加载时并不实际加载符号,而是等到调试器用到的时候才加载。查看延迟符号加载获取详细信息。

所有调试器默认打开该选项。在CDB和KD中,-s命令行选项可以关闭它。对于CDB也可以通过使用tools.ini 文件的LazyLoad变量来关闭。调试器运行时,通过.symopt+0x4.symopt-0x4,来打开或关闭。

DBH中该选项默认关闭。DBH运行时可通过symopt +4symopt -4来打开或关闭。

SYMOPT_NO_CPP

该选项关闭C++转换。设置了这个选项时,所有符号中的::都被__ 替代。

所有调试器默认关闭该选项。它可以通过-snc命令行选项打开。调试器运行时,通过.symopt+0x8.symopt-0x8来打开关闭。

DBH默认关闭该选项。运行时通过symopt +8symopt -8来打开关闭。

SYMOPT_LOAD_LINES

该选项允许从源码文件中读取行号信息。必须打开才能使得源码调试正确工作。

在KD和CDB中该选项默认关闭;在WinDbg中默认打开。对于CDB和KD可以通过-lines 命令行选项来打开。调试器运行时,可以通过.symopt+0x10.symopt-0x10来打开关闭。也可以通过 .lines (Toggle Source Line Support)命令来打开或关闭。

DBH中默认打开该选项。运行时可以通过symopt +10symopt -10来打开关闭。

SYMOPT_OMAP_FIND_NEAREST

当代码被优化,并且期望的位置没有符号时,启用该选项会用最靠近的符号来替代。

所有调试器默认打开该选项。运行时,通过.symopt+0x20.symopt-0x20来打开关闭。

DBH中默认打开。运行时可以通过symopt +20symopt -20来打开关闭。

SYMOPT_LOAD_ANYTHING

该选项降低符号处理器尝试匹配符号时的精确性。

所有调试器默认关闭。运行时可以通过.symopt+0x40.symopt-0x40来打开关闭。

DBH中默认关闭。运行时通过symopt +40symopt -40来打开关闭。

SYMOPT_IGNORE_CVREC

该选项使得符号处理器在搜索符号时,忽略已加载模块映像头中的CV记录。

所有调试器中默认关闭。可以通过-sicv 命令行选项打开。运行时通过.symopt+0x80.symopt-0x80打开关闭。

DBH中默认关闭。运行时通过symopt +80symopt -80打开关闭。

SYMOPT_NO_UNQUALIFIED_LOADS

该选项禁止符号处理器自动为模块进行加载。设置这个选项并且调试器尝试匹配某个符号时,它只会在已加载模块中搜索。

这个选项可以用来避免误输入符号名的问题。通常,误输入符号使得调试器搜索所有卸载的符号文件时暂停。使用该选项,误输入的符号在已加载模块中找不到,所以搜索就会被中止。

所有调试器默认关闭该选项。可以通过-snul命令行选项激活。运行时通过.symopt+0x100.symopt-0x100打开关闭。

DBH中默认关闭。运行时通过symopt +100symopt -100打开关闭。

SYMOPT_FAIL_CRITICAL_ERRORS

这个选项使得文件访问错误对话框被取消掉。

如果该选项关闭,再符号加载时遇到的类似"驱动器未准备好"这样的文件访问错误,会出现一个对话框。如果该选项打开,这些对话框不会出现,并且所有访问错误都会收到一条"fail"的响应。

所有调试器默认打开该选项。可以通过-sdce命令行选项来关闭。运行时通过.symopt+0x200.symopt-0x200来打开关闭。

DBH默认关闭。运行时,通过symopt +200symopt -200来打开关闭。

SYMOPT_EXACT_SYMBOLS

这个选项使得调试器对所有符号文件进行严格的匹配。

打开时,即使符号文件和符号处理器的要求有很小的差异,这些符号也会被忽略。

调试器默认关闭该选项。可以通过-ses来激活。运行时,通过.symopt+0x400.symopt-0x400来打开关闭。

-failinc命令行选项也打开SYMOPT_EXACT_SYMBOLS。另外,如果调试用户模式minidump或内核模式minidump, -failinc将防止调试器加载任何映像不能被映射的模块。

DBH中默认打开。运行时通过symopt +400symopt -400来打开关闭。

SYMOPT_ALLOW_ABSOLUTE_SYMBOLS

该选项使得DbgHelp可以读取保存在内存某个绝对地址中的符号。绝大多数情况下不需要该选项。

所有调试器中默认关闭。运行时通过.symopt+0x800.symopt-0x800来打开关闭。

DBH中默认打开。运行时通过symopt +800symopt -800来打开关闭。

SYMOPT_IGNORE_NT_SYMPATH

该选项使得调试器忽略环境变量中设置的符号路径和可执行映像路径。

所有调试器默认关闭该选项。可以通过-sins命令行选项激活。但是,运行时不能通过.symopt 命令来控制,因为环境变量仅在启动时会被读取。

DBH中默认关闭,并且任何情况下都会被DBH忽略。

SYMOPT_INCLUDE_32BIT_MODULES

这个选项强制DbgHelp和ImageHlp在枚举Intel Itanium处理器上的32位模块。

所有调试器默认关闭该选项。运行时通过.symopt+0x2000.symopt-0x2000来打开关闭。

DBH中默认关闭。运行时通过symopt +2000symopt -2000打开关闭。

SYMOPT_PUBLICS_ONLY

这个选项使得DbgHelp忽略私有符号数据,仅在公有符号表中搜索符号信息。这是模拟DbgHelp加入对这些类型的支持之前的行为。查看公有和私有符号

所有调试器中都默认关闭。运行时通过.symopt+0x4000.symopt-0x4000来打开关闭。

DBH 中默认关闭。可以通过-d命令行选项打开。运行时通过symopt +4000symopt -4000打开关闭。

SYMOPT_NO_PUBLICS

该选项阻止DbgHelp搜索公有符号表。这使得符号枚举和搜索变得更快。如果比较关心搜索速度,那么SYMOPT_AUTO_PUBLICS 选项比较适合。关于公有符号表的信息,查看公有和私有符号

所有调试器中默认关闭。运行时,通过.symopt+0x8000.symopt-0x8000打开关闭。

DBH中默认关闭。运行时通过symopt +8000symopt -8000打开关闭。

SYMOPT_AUTO_PUBLICS

这个选项使得DbgHelp将在.pdb中搜索公有符号表作为最后的选择。如果在私有符号中找到了任何匹配,公有符号就不会再被搜索。这样会提高搜索速度。

所有调试器中默认打开。可以通过-sup命令行选项关闭。运行时通过.symopt+0x10000.symopt-0x10000打开关闭。

DBH中默认打开。使用-d命令行选项时会被关掉。运行时,使用symopt +10000symopt -10000打开关闭。

SYMOPT_NO_IMAGE_SEARCH

这个选项避免在加载符号时DbgHelp搜索磁盘查找映象文件的拷贝。

所有调试器中默认打开。运行时通过.symopt+0x20000.symopt-0x20000打开关闭。

DBH中默认关闭。运行时通过symopt +20000symopt -20000打开关闭。

SYMOPT_SECURE

(仅内核模式) 该选项指示是否激活了安全模式

所有调试器默认关闭。可以通过-secure命令行选项激活。如果调试器正在运行、在静止模式下,并且没有建立任何调试服务器,可以通过.symopt+0x40000.secure (Activate Secure Mode)来打开安全模式。

DBH中默认关闭。运行时通过symopt +40000symopt -40000来打开关闭。

安全模式一旦激活之后就不能再关闭

SYMOPT_NO_PROMPTS

这个选项阻止来自代理服务器的验证对话框。这可能使得SymSrv 不能访问internet上的符号存储。

详细信息,查看防火墙和代理服务器

在KD和CDB中,该选项默认打开;WinDbg中默认关闭。调试器运行时可以通过.symopt+0x80000.symopt-0x80000,后跟 .reload (Reload Module) 命令来打开或关闭。也可以使用!sym prompts off!sym prompts 扩展命令,后跟 .reload (Reload Module) 命令了来打开关闭。

DBH中默认关闭。运行时通过symopt +80000symopt -80000来打开关闭。

SYMOPT_DEBUG

该选项打开详细符号加载(noisy symbol loading)。他使得调试器搜索符号时显示信息。

所有符号文件加载时会显示名字。如果调试器不能加载某个符号文件,会显示错误信息。.pdb文件的错误信息以文本方式显示,.dbg文件的错误信息以错误码方式显示。这些错误码在winerror.h文件中说明。

如果某个映像文件被重新加载以获取符号化的头信息,也会被显示出来。

所有调试器默认关闭该选项。可以通过-n命令行选项激活。运行时通过.symopt+0x80000000.symopt-0x80000000来打开关闭。也可以通过!sym noisy!sym quiet命令来打开或关闭。

注意  这个选项不能和详细源码加载(noisy source loading)混淆——它是用.srcnoisy (Noisy Source Loading)命令来控制的。

DBH中默认关闭。可以使用-n命令行选项激活。DBH运行时,可以通过symopt +80000000symopt -80000000来打开或关闭。也可以通过verbose onverbose off 命令来打开或关闭。

posted on 2008-05-26 11:47 NetRoc 阅读(494) 评论(0)  编辑 收藏 引用

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

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜