什么是符号路径呢?就是调试器寻找符号文件的方向,它可以是本地文件夹路径、可访问的UNC路径、或者是符号服务器路径。什么是符号服务器呢?如果调试过程中,需要涉及到成千上万个符号文件,以及同一个符号文件存在不同平台下的不同符号文件版本的时候,那么一一手动设置符号路径肯定是不现实的,于是引入符号服务器的概念。符号服务器有一套命名规则,使得调试软件能够正确找到需要的符号文件。一般来说,符号服务器比较大,都是共用的,放在远程主机上。为了降低网络访问的成本,又引入了符号缓存的概念,即将从服务器上下载到的符号文件,保存在本地缓存中,以后调试器需要符号文件的时候,先从缓存中寻找,找不到的时候再到服务器上下载。下面分几部分一一来看。
设置符号路径:
设置符号路径的语法如下:
- .sympath [+] [路径]
如果不加入任何参数执行.sympath命令,将显示当前的路径设置:
- .sympath
如要覆盖原来的路径设置,使用新路径即可:
- .sympath <新路径>
要在原有路径的基础上添加一个新路径,可使用:
- .sympath+ <新增路径>
要注意的是,使用.sympath改变或新增符号路径后,符号文件并不会自动更新,应再执行.reload命令以更新之。
这里要谈一谈延迟加载的知识点。延迟加载使得模块的符号表,只在第一次真正使用的时候才被加载。这加快了程序启动,不用在一开始耗费大量时间加载全部的符号文件。
使用.symopt +4和.symopt -4来开启或关闭延迟加载设置。
在已经启动了延迟加载的情况下,如想临时改变策略,立刻将指定模块的符号加载到调试器中,可以使用ld或者.reload /f命令。
符号服务器与符号缓存:
设置符号服务器的基本语法是:
- SRV*[符号缓存]*服务器地址
语法由SRV引导,符号缓存和服务器地址的前面各有一个星号引导。符号缓存一般也叫做下游符号库。如某公司有一台专门的符号服务器,地址为\\symsrv\\symbols,则他们公司的所有开发人员都应该在他们的调试器中使用类似下面的命令:
- .sympath+ srv*c:\symbols*\\symsrv\symbols
此外,我们总是应该把微软的公用符号库加入到我们的符号路径中:
- .sympath+ srv*<缓存地址>*http://msdl.microsoft.com/download/symbols
这是一台微软对外公开的服务器,使用http地址访问,不是所有人都能牢记这个网址,所以最好的办法就是使用.symfix命令,语法如下:
- .symfix [+] [符号缓存地址]
这个命令等价于上面的.sympath命令,而不用输入长长的http地址。
0:000> .symfix c:\windows\symbols 0:000> .sympath Symbol search path is: SRV*c:\windows\symbols*http://msdl.microsoft.com/download/symbols
符号选项:
命令格式如下:
- 显示当前设置:.symopt
- 增加选项:.symopt+ Flags
- 删除选项:.symopt- Flags
第一个命令没有任何参数,显示当前设置。后面两个,第二个命令含有“+”代表添加一个选项,第三个命令含有“-”代表去除一个选项。
001> .symopt Symbol options are 0x30337: 0x00000001 - SYMOPT_CASE_INSENSITIVE 0x00000002 - SYMOPT_UNDNAME 0x00000004 - SYMOPT_DEFERRED_LOADS 0x00000010 - SYMOPT_LOAD_LINES 0x00000020 - SYMOPT_OMAP_FIND_NEAREST 0x00000100 - SYMOPT_NO_UNQUALIFIED_LOADS 0x00000200 - SYMOPT_FAIL_CRITICAL_ERRORS 0x00010000 - SYMOPT_AUTO_PUBLICS 0x00020000 - SYMOPT_NO_IMAGE_SEARCH
可用的符号选项请见下表:
值 | 可读名称 | 描述 |
0×1 | SYMOPT_CASE_INSENSITIVE | 符号名称不区分大小写 |
0×2 | SYMOPT_UNDNAME | 符号名称未修饰 |
0×4 | SYMOPT_DEFERRED_LOADS | 延迟加载 |
0×8 | SYMOPT_NO_CPP | 关闭C++转换,C++中的::符号将以__显示 |
0×10 | SYMOPT_LOAD_LINES | 从源文件中加载行号 |
0×20 | SYMOPT_OMAP_FIND_ NEAREST | 如果由于编译器优化导致找不到对应的符号,就以最近的一个符号代替之 |
0×40 | SYMOPT_LOAD_ANYTHING | 使得符号匹配的时候,匹配原则较松散,不那么严格。 |
0×80 | SYMOPT_IGNORE_CVREC | 忽略镜像文件头中的CV记录 |
0×100 | SYMOPT_NO_UNQUALIFIED_ LOADS | 只在已加载模块中搜索符号,如果搜索符号失败,不会自动加载新模块。 |
0×200 | SYMOPT_FAIL_CRITICAL_ ERRORS | 不显示文件访问错误对话框。 |
0×400 | SYMOPT_EXACT_SYMBOLS | 进行最严格的符号文件检查,只要有微小的差异,符号文件都不会被加载。 |
0×800 | SYMOPT_ALLOW_ABSOLUTE_ SYMBOLS | 允许从内存的一个绝对地址处读取符号信息。 |
0×1000 | SYMOPT_IGNORE_NT_ SYMPATH | 忽视在环境变量中设置的符号路径,也忽视被调试进程的执行路径。也就是说,当搜索符号文件的时候,不会从这些路径中搜索。 |
0×2000 | SYMOPT_INCLUDE_32BIT_MODULES | 让运行在安腾系统上的调试器,也枚举32位模块。 |
0×4000 | SYMOPT_PUBLICS_ONLY | 仅搜索符号文件的公共(PUBLIC)符号表,忽略私有符号表。 |
0×8000 | SYMOPT_NO_PUBLICS | 不搜索符号文件的公共(PUBLIC)符号表 |
0×10000 | SYMOPT_AUTO_PUBLICS | 先搜索pdb文件的私有符号表,如果在其中找到对应的符号,就不再搜索公共(PUBLIC)符号表,这可以加快搜索速度。 |
0×20000 | SYMOPT_NO_IMAGE_SEARCH | 不搜索镜像拷贝 |
0×40000 | SYMOPT_SECURE | 安全模式,让调试器尽量不影响到主机。 |
0×80000 | SYMOPT_NO_PROMPTS | 不显示符号代理服务器的认证对话框,将导致某些时候无法访问符号服务器 |
0×80000000 | SYMOPT_DEBUG | 显示符号搜索的详细过程和信息 |