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

C/C++本地代码调试

帖子发起人: Forward   发起时间: 2011-12-15 10:43 上午   回复: 4

Print Search
帖子排序:    
   2011-12-15, 10:43 上午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump
Reply Quote

张老师,大家好:

背景:

      最近我接手了一个调试任务,我们的一个软件(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                         ***
***                                                                   ***
*************************************************************************


IP 地址: 已记录   报告
   2011-12-15, 10:46 上午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump
Reply Quote

张老师,大家好:

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


IP 地址: 已记录   报告
   2011-12-15, 10:49 上午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump

附件: crash_111214_113856.rar
Reply Quote

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


IP 地址: 已记录   报告
   2011-12-18, 12:44 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump
Reply Quote

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

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

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

 

 

 


IP 地址: 已记录   报告
   2011-12-19, 10:48 上午
wbdwbd04 离线,最后访问时间: 2011/6/7 7:59:42 Forward

发帖数前25位
注册: 2009-12-23
发 贴: 50
Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump
Reply Quote

张老师,大家好:

      更正一个错误,我在抓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 对么???


IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: 使用WindDbg(x86)在32位机器上,调试运行在64位机器上的32位程序的一个crash dump

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