Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump

C/C++本地代码调试

使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump


Forward 2011-12-15, 10:43 上午

张老师,大家好:

背景:

      最近我接手了一个调试任务,我们的一个软件(32位)运行在服务器(Windows2008 R2 64)上,偶尔出现crash的现象,这个现象很难抓取(半年4次)。

      我首先写了一个小得测试程序crash_simulate.exe,人为的制造了一个除零异常,来熟悉调试环境。

      由于这个台服务器,不允许随意安装软件,因此我使用procdump这个小软件抓取dump,命令为procdump -e crash_simulate.exe crash.dump。

      之后在服务器上运行crash_simulate.exe制造了一个除零异常,之后抓取crash_yymmdd_hhmmss.dump文件(见附件)。

      我的机器(Windows xp 32位)使用Windbg(x86)来调试这个crash_yymmdd_hhmmss.dump文件。

调试问题:

      1.使用!analyze -v命令对dump进行分析,能够看到windbg已经分析出错误地址如下,但是为什么使用r命令得到 eip = 7583c9f1 ,同样发现esp=0008dc20也是一个无效值,使用dd esp 得到的结果都是???

         FAULTING_IP: 
         crash_simulate+1c9f
         0033:00401c9f <Effective machine and debuggee state conflict, disassembly not possible>

      2.在64位机上运行32位程序,应该使用wow64子系统,于是我又使用!load wow64exts;!sw命令切换到64位模式。

        同样这里使用r命令得到rip = 000000007583c9f1 ,rbp=000000000008df60,之后使用kL命令得到

         00000000`0008dc20 00000000`00000000 wow64!Wow64NotifyDebugger+0x1d,也不是错误指令地址。这是为什么呢?是不是rip到eip有一个转换关系?能够将000000007583c9f1 转换为00401c9f 呢?

      3.在张老师的64位编程调试,文档最后一段理解wow64中给了一个!wow64exts.info的图例,图中看出有2个PEB,2个TEB,2个用户台栈,为什么我同样使用这个命令我得到的结果却是:

   0:000> !wow64exts.info
            Could not get the address of the 32bit PEB, error 0x8007001e

            PEB32: 0
            PEB64: 0x7efdf000

            Wow64 information for current thread:

            TEB32: 0x7efdd000
            TEB64: 0x7efdb000

            Could not get information for 32bit stack, error 0x8007001e
            64 bit, StackBase   : 0x8fd20
              StackLimit  : 0x89000
              Deallocation: 0x50000


Wow64 TLS slots:

WOW64_TLS_STACKPTR64:       0x0000000000000000
WOW64_TLS_CPURESERVED:      0x000000000008fd20
WOW64_TLS_INCPUSIMULATION:  0x0000000000000004
WOW64_TLS_LOCALTHREADHEAP:  0x000000000008e3b0
WOW64_TLS_EXCEPTIONADDR:    0x0000000000000000
WOW64_TLS_USERCALLBACKDATA: 0x0000000000000000
WOW64_TLS_EXTENDED_FLOAT:   0x0000000000000000
WOW64_TLS_APCLIST:          0x0000000000000000
WOW64_TLS_FILESYSREDIR:     0x0000000000000000
WOW64_TLS_LASTWOWCALL:      0x0000000000000000
WOW64_TLS_WOW64INFO:        0x000000007efde248

      4.我的符号表路径中已经设置服务器符号表(srv*c:\Symbols*http://msdl.microsoft.com/download/symbols)为什么仍然提示(我在一个英文网站上查到,这个好像是个bug,是么?)

*************************************************************************
***                                                                   ***
***                                                                   ***
***    Your debugger is not using the correct symbols                 ***
***                                                                   ***
***    In order for this command to work properly, your symbol path   ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: kernel32!pNlsUserInfo                         ***
***                                                                   ***
*************************************************************************

Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump


Forward 2011-12-15, 10:46 上午

张老师,大家好:

       刚才附件没传上来,这次修改了下格式将.dump改为ext以便上传,大家在用的时候还要将格式改为.dump

Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump


Forward 2011-12-15, 10:49 上午

我晕,又失败了。。。我再试。

Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump


格蠹老雷 2011-12-18, 12:44 下午

看了下dump,的确不太成功, 建议:

- 因为是WOW的进程,尝试不要用64选项;

- 使用-ma选项,包含更多信息

 

 

 

Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump


Forward 2011-12-19, 10:48 上午

张老师,大家好:

      更正一个错误,我在抓dump的时候,使用的是procdump  -64 -e crash_simulate.exe crash.dmp 命令, 这个在使用windbg解析dump的时候能够看到。

Comment: '
*** procdump  -64 -e crash_simulate.exe crash.dmp
*** Unhandled exception'

张老师:

      我没有明白你的意思。您是说在抓取dump的时候要加 -ma参数么??

    “尝试不要用64选项”是不是说,在抓取dump的时候,不要加-64参数?

       也就是说我在抓取dump的时候使用命令 procdump  -ma -e crash_simulate.exe crash.dmp 对么???

Powered by Community Server Powered by CnForums.Net