张老师,大家好:
背景:
最近我接手了一个调试任务,我们的一个软件(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: 0x0000000000000000WOW64_TLS_CPURESERVED: 0x000000000008fd20WOW64_TLS_INCPUSIMULATION: 0x0000000000000004WOW64_TLS_LOCALTHREADHEAP: 0x000000000008e3b0WOW64_TLS_EXCEPTIONADDR: 0x0000000000000000WOW64_TLS_USERCALLBACKDATA: 0x0000000000000000WOW64_TLS_EXTENDED_FLOAT: 0x0000000000000000WOW64_TLS_APCLIST: 0x0000000000000000WOW64_TLS_FILESYSREDIR: 0x0000000000000000WOW64_TLS_LASTWOWCALL: 0x0000000000000000WOW64_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 ****** ****************************************************************************
刚才附件没传上来,这次修改了下格式将.dump改为ext以便上传,大家在用的时候还要将格式改为.dump
我晕,又失败了。。。我再试。
看了下dump,的确不太成功, 建议:
- 因为是WOW的进程,尝试不要用64选项;
- 使用-ma选项,包含更多信息
更正一个错误,我在抓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 对么???