当程序存在偶发的崩溃问题时,设置测试程序生成dump文件,可以用于或许分析崩溃点。
当前假设已经拿到dump文件,并且有程序执行以来的dll文件(最好是debug模式),使用windbg就可以分析调用栈,寻找崩溃点。
打开WindowsKits,找到windbg.exe打开
将dump文件拖入windbg界面,输入lmf
显示dump依赖的所有dll文件路径和名称,确保这些dll都存在,如果不存在(dump拷贝到其他PC分析的情况下),可以创建这些目录,将dll放在这些目录下。
输入!analyze -v
分析崩溃点
典型的调用栈如下:
f9357734 804f880d 00000003 f9357a90 00000000 nt!RtlpBreakWithStatusInstruction
f9357780 804f93fa 00000003 e1147008 fbe93403 nt!KiBugCheckDebugBreak+0x19
f9357b60 80540853 0000000a e1147008 0000001c nt!KeBugCheck2+0x574
f9357b60 fbe93403 0000000a e1147008 0000001c nt!KiTrap0E+0x233
WARNING: Stack unwind information not available. Following frames may be wrong.
f9357c58 805759d1 ffb5c3b0 8111f318 811d9130 myfault+0x403
f9357d00 8056e33c 00000090 00000000 00000000 nt!IopXxxControlFile+0x5e7
f9357d34 8053d808 00000090 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
f9357d34 7c92eb94 00000090 00000000 00000000 nt!KiFastCallEntry+0xf8
0012f9f0 7c92d8ef 7c801671 00000090 00000000 ntdll!KiFastSystemCallRet
0012f9f4 7c801671 00000090 00000000 00000000 ntdll!ZwDeviceIoControlFile+0xc
0012fa54 004018c2 00000090 83360018 00000000 0x7c801671
这时就可以使用反编译工具,找到对应dll和函数入口,根据函数后的偏移地址,找到崩溃点。
比较困难的是复原当前数据状态,分析是什么异常或者未定义行为导致崩溃。通常是越界,访问空指针等问题。