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,至此已经成功找到出错的代码。

参考文章: http://ikeepu.com/bar/10429474

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值