windbg符号路径

什么是符号路径呢?就是调试器寻找符号文件的方向,它可以是本地文件夹路径、可访问的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

此外,我们总是应该把微软的公用符号库加入到我们的符号路径中:

这是一台微软对外公开的服务器,使用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

显示符号搜索的详细过程和信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值