张老师,大家好:
背景:
最近我接手了一个调试任务,我们的一个软件(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 *** *** *** *************************************************************************
|