调试Release发布版程序的Crash错误(Win7)

      今天软件突然挂了,只有event log可以参考,研究了半天,在网上也找了很多资料。有很多很好的资料,不过貌似没有win7版本的,都是xp的。因为win7的event log和xp的貌似有点不同,研究了半天,总结出一点,写下来,供大家参考下:

      配置:WIN7 + VS2010

 

       配置 VS2010:

  • 打开map:linker --> Debugging --> Generate Map File
           

  • 打开COD: C/C++  --> Output Files --> Assembler Output

             

  •       编写了一段空指针的代码:

          

  

  •   运行程序,程序crash。查看event viewer:发现其错误偏移地址是:Fault offset: 0x00002752
          

      

  • 打开对应程序的map文件:这时候就有问题,这个错误偏移地址Fault offset: 0x00002752,如何计算出对应的代码呢?一些文章中给出的公式如下:

崩溃行偏移 = 崩溃地址 - 崩溃函数绝对地址 + 函数相对偏移

但是我算了半天,貌似算不出来。想了半天,终于明白了,首先计算崩溃绝对地址:

   崩溃绝对地址 = Fault offset + 0x0040 0000

带入event viewer给出值Fault offset: 0x00002752,得到崩溃绝对地址:0x0040 2752

  • 根据得到的崩溃绝对地址,查找map文件,相应的函数的地址是:

崩溃函数绝对地址 < 崩溃绝对地址 < 下一个函数绝对地址

查找相应的map文件,发现:OnTimer 的绝对地址 < 崩溃绝对地址 <  OnSize的绝对地址



因此能够判断crash发生在OnTimer的函数之内。

  • 查出崩溃所在的函数之后,需要查找具体crash行的代码。首先,计算crash行的代码相对于函数的偏移:

崩溃行偏移 = 崩溃绝对地址 - 崩溃函数绝对地址

带入相应的值:

崩溃行偏移 = 0x0040 2752 - 0x0040 2700 --> 得到崩溃行偏移0x52.

  • 在找出崩溃函数和崩溃行偏移之后,如果需要定位代码,就需要cod文件了:


....


如上图,先找出OnTimer这个函数,然后在这个函数内部根据偏移地址 0x52确定出问题的代码是:(2) move DWORD PTR[eax], eax,空指针异常。

此外上图中红圈(1)所标示的数字343代表的意思是: 代码行

有人会觉得奇怪,为什么没有test_crash01和test_crash这两个函数,因为它们被编译器优化掉了。。。。

我想这个时候就能基本上确定出问题的代码了,当然也许有时候需要依据上下文作出判断。。。。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值