Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

WinDbg

帖子发起人: guozf   发起时间: 2009-03-23 08:54 上午   回复: 9

Print Search
帖子排序:    
   2009-03-23, 08:54 上午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Smile [:)] WinDbg对局部变量的显示有误?
Reply Quote

最近在做了半年WinDbg的研究,买了两本《软件调试》(一本是新加坡的Director要我帮买的),从头看了一遍,从中受益不少。最近在做Windbg自动化的项目,碰到一些问题,来这里请教一些高人。现对各位关注的朋友致谢。

问题描述如下:

我们知道Visual Studio对程序的编译有2种模式:Debug&Release,发现Debug模式下WinDbg对局部变量的支持很好,但是Release模式下WinDbg好像对一些局部变量的地址解析有误,所以变量的值自然就不对了。测试过Visual Studio的debugger即使在Release模式下对局部变量的支持依然很好。

局部变量的地址是根据当前线程的EBP+偏移来确定的。Release模式下编译器可能作了一些优化,对一些函数的调用省略了EBP的更新,而直接用ESP+偏移来引用局部变量的地址。

了解到WinDbg对PDB地分析是基于dbghelp.dll,而Visual Studio是基于另外的一个DIA SDK.

想请问局部变量在PDB中存储的信息包括什么?以及是否可以自己写Windbg的扩展命令,使用DiA SDK来解析局部变量,这样来解决WinDbg对release模式局部变量的检查错误。

另外,感觉很奇怪的事情是,不知道MS windbg的研发小组为什么会放着这样的错误不解决呢?


IP 地址: 已记录   报告
   2009-03-23, 08:55 上午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg对局部变量的现实有误?
Reply Quote
请Raymond老师多多请教
IP 地址: 已记录   报告
   2009-03-23, 09:09 上午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: WinDbg对局部变量的现实有误?
Reply Quote
显然没有错误...
IP 地址: 已记录   报告
   2009-03-23, 09:11 上午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg对局部变量的显示有误?
Reply Quote
请问 王宇 有做过详细的测试么?
IP 地址: 已记录   报告
   2009-03-23, 09:11 上午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg对局部变量的显示有误?
Reply Quote
请问有做过详细的测试么?
IP 地址: 已记录   报告
   2009-03-23, 23:41 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: WinDbg对局部变量的显示有误?
Reply Quote

简单来说,这个问题主要是编译器和调试符号的问题,不是WinDBG的问题。
以VC8(VS2005)为例,使用默认选项构建出的发布版本,在IDE下和WinDBG都可以正确的显示局部变量(参见下图)。

对于VC6,默认的发布版本配置,不会产生符号文件,手工配置后,可以产生,也可以使用,但是在某些函数位置显示局部变量时,的确有错误,但是这样的错误,无论是用VC6自己调试,还是使用WinDBG都会出现。

注意上面的显示中,参数和变量显示完全错位了,0x2510c2应该是hWnd的值。但VC6自己也有这样的问题:

其实,其中的原理和导致问题的原因也很简单,使用SymView工具看一下,便很清楚。

VC6编译时,使用了FPO,而FPO一向是阻碍调试功能的“绊脚石”。

而,VC8没有使用FPO,符号中的偏移位置也很是规范,EBP+8为为第一个参数:

 

 

 


IP 地址: 已记录   报告
   2009-03-24, 09:43 上午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg对局部变量的显示有误?
Reply Quote
谢谢Raymond得认真解答,我所在的公司使用的标准编译器是Visual Studio 2002,暂时也不会换编译器,因为要换编译器的代价很大,很多代码都要重新编译。
我在Visual Studio 2002下使用release模式的默认编译选项,之后分别用Visual Studio和WinDbg测试的结果是:Visual Studio对于局部变量的现实完全准确,而Windbg对局部变量的地址偏移完全搞错了。

抱歉,图片不知道怎么贴上来 :)

想问Raymond Windbg在做局部变量的解析的时候是否先从PDB中那个offset,然后用当前的bp+offset来确定局部变量的地址。这样只要offset没有问题,局部变量的地址也应该没有问题。

但是我看过一些程序编译出来的汇编代码,有一些函数对局部变量的引用是通过sp-**,这样PDB中保存得offset如何与sp配合来拿到正确的局部变量的地址?

非常感谢。
IP 地址: 已记录   报告
   2009-03-24, 11:51 上午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg对局部变量的显示有误?
Reply Quote

screenshot:


IP 地址: 已记录   报告
   2009-03-24, 13:01 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: WinDbg对局部变量的显示有误?
Reply Quote
你说的使用SP寄存器来引用参数和变量的方法就是FPO,PDB中的帧数据表中保存有栈帧的信息,有一类栈帧信息就是专门描述FPO的,帧数据中可以有使用逆波兰式保存的程序(类似脚本),调试器可以根据这样的程序来寻找到合适的栈帧数据,包括栈帧基地址和返回地址等,参见25.8.6节和MSDN中关于IDiaFrameData的说明。

IP 地址: 已记录   报告
   2009-03-24, 16:48 下午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: WinDbg对局部变量的显示有误?
Reply Quote
谢谢。
IP 地址: 已记录   报告
高端调试 » 软件调试 » WinDbg » Re: WinDbg对局部变量的显示有误?

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.