windbg 分析dmp文件之-空指针!!

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: pc_testdemo1demo1demo1.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分析完毕.

经验分享 程序员 微信小程序 职场和发展