win7+vs2010通過map文件和cod文件找到崩潰的代碼行


用來演示出錯的源代碼:
#include "stdio.h"

void errorFun(int * p)   
{   
*p=1;   
}   

int main()   
{   
int * p=NULL;   
errorFun(p);   
return 0;   

工程選項設置:


 

編譯運行後報錯,點擊“查看問題詳細信息”,看到異常偏移:000113a1

再打開目錄下的.map文件,看到一行 Preferred load address is 00400000,表示起始地址是00400000,根據崩潰地址=起始地址+偏移地址,即崩潰地址=00400000+000113a1=004113a1,通過這個地址找到第一個比這個地址大的一行的前一行,也就是00411380 ,這個代表出錯函數的起始地址,同時可以看到出錯函數是errorFun函數
 0002:00000380       ?errorFun@@YAXPAH@Z        00411380 f   char_demo.obj
 0002:000003c0       _main                      004113c0 f   char_demo.obj

已經定位到出錯函數了,下一步精確定位到出錯代碼行,打開.cod文件,通過搜索"errorFun"找到:
?errorFun@@YAXPAH@Z PROC; errorFun, COMDAT


; 4    : {   


  00000 55 push ebp
  00001 8b ec mov ebp, esp
  00003 81 ec c0 00 00
00 sub esp, 192; 000000c0H
  00009 53 push ebx
  0000a 56 push esi
  0000b 57 push edi
  0000c 8d bd 40 ff ff
ff lea edi, DWORD PTR [ebp-192]
  00012 b9 30 00 00 00 mov ecx, 48; 00000030H
  00017 b8 cc cc cc cc mov eax, -858993460; ccccccccH
  0001c f3 ab rep stosd


; 5    : *p=1;   


  0001e 8b 45 08 mov eax, DWORD PTR _p$[ebp]
  00021c7 00 01 00 00
00 mov DWORD PTR [eax], 1


; 6    : }  
這裏的4,5,6代表源代碼的行,比如4在源代碼中對應"{"
然後根據:崩潰地址-函數起始地址= 004113a1 -00411380=0x21,在code文件中找到 00021,向前看看到“; 5    : *p=1;   ”,即出錯代碼行數是第5行,代碼是*p=1,至此已經成功找到出錯的代碼。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章