1、测试程序
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int *pTest = NULL;
printf("%d",*pTest);
return 0;
}
2、自动生成dmp代码 自行copy,这里略。或者通过vs 调式的时候 选择保存save dump as...
3、启动windbdg
1)、配置pdb位置。
2)、配置源码位置。
4、打开demo1.dmp
5、在windbg命令行输入!analyze -v
结果如图:
//汇编代码对比如下:
int _tmain(int argc, _TCHAR* argv[])
{
00BA13A0 push ebp
00BA13A1 mov ebp,esp
00BA13A3 sub esp,0CCh
00BA13A9 push ebx
00BA13AA push esi
00BA13AB push edi
00BA13AC lea edi,[ebp-0CCh]
00BA13B2 mov ecx,33h
00BA13B7 mov eax,0CCCCCCCCh
00BA13BC rep stos dword ptr es:[edi]
int *pTest = NULL;
00BA13BE mov dword ptr [pTest],0
printf("%d",*pTest);
00BA13C5 mov esi,esp
00BA13C7 mov eax,dword ptr [pTest] //取出pTest(自己地址&pTest 0x0073f860 int * *)指针存储的地址到eax 中。
00BA13CA mov ecx,dword ptr [eax] //取出eax中 指向的内容放到ecx中 。
00BA13CC push ecx
00BA13CD push offset string "%d" (0BA573Ch)
00BA13D2 call dword ptr [__imp__printf (0BA82BCh)]
00BA13D8 add esp,8
00BA13DB cmp esi,esp
00BA13DD call @ILT+320(__RTC_CheckEsp) (0BA1145h)
return 0;
6、erro 提示 将pTest [eax]放到 ecx中,而eax为空,所有抛出异常了。
demo1!wmain+2a [d:\rpc_test\demo1\demo1\demo1.cpp @ 10]
00ba13ca 8b08 mov ecx,dword ptr [eax]
7、可以查看下寄存器 对比下 eax 和ecx是否为空 在windbg输入 r 查询寄存器:
0:000> r
eax=00000000 ebx=004dc000 ecx=00000000 edx=00000001 esi=0073f790 edi=0073f868
eip=00ba13ca esp=0073f790 ebp=0073f868 iopl=0 nv up ei pl nz ac pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010216
demo1!wmain+0x2a:
00ba13ca 8b08 mov ecx,dword ptr [eax] ds:002b:00000000=????????
8、至此空指针崩溃dmp分析完毕.