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

    


猜你喜欢

转载自blog.csdn.net/jangdong/article/details/80707676
今日推荐