Debugging Tools for Windows

设置符号选项

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

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

标志 选项名 调试器的默认值 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 +1 symopt -1来打开或关闭。

SYMOPT_UNDNAME

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

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

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

SYMOPT_DEFERRED_LOADS

该选项称为延迟符号加载(deferred symbol loading 或lazy 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 +200 symopt -200来打开关闭。

SYMOPT_EXACT_SYMBOLS

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

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

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

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

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

SYMOPT_ALLOW_ABSOLUTE_SYMBOLS

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

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

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

SYMOPT_IGNORE_NT_SYMPATH

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

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

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

SYMOPT_INCLUDE_32BIT_MODULES

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

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

DBH中默认关闭。运行时通过symopt +2000 symopt -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 +8000 symopt -8000打开关闭。

SYMOPT_AUTO_PUBLICS

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

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

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

SYMOPT_NO_IMAGE_SEARCH

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

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

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

SYMOPT_SECURE

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

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

DBH中默认关闭。运行时通过symopt +40000 symopt -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 on verbose off 命令来打开或关闭。

Build machine: CAPEBUILD