简单的定位到程序崩溃地点的方法

原创 2007年09月29日 09:49:00



事例程序

2k以上的操作系统,微软提供了一种新的功能Online Crash Analysis,简称OCA,就是当程序崩溃的时候我们看到的的那个对话框,问你是否把崩溃的一些信息发送到微软,各个软件厂商可以从微软那里根据收集到的程序版本和出错的地址等信息来完善自己的程序。

如果你手头什么小工具都没有的情况下,下面这个方法可以很快的手工定位到出错地点。

点击“请单击此处”,可以看到详细的信息。


其中AppName是出错程序的exe文件名,AppVer是exe文件版本,ModName是此exe文件调用的崩溃模块的名称,ModVer是版本,最重要的就是Offset了,是崩溃的地址。

找到与出错版本程序对应的代码版本,在工程选项设置里Link->General勾上Generate mapfile,创建出一个与编译结果同名的map文件;并且在C/C++->Listing Files->Listing file type中选择Assembly,Machine Code,and Source一项,这样会为每个cpp文件创建出一个同名的cod文件。

编译出来以后我们就可以根据程序崩溃的地址开始一步步的寻找源头了。

事例程序是我用VC创建的一个对话框工程,然后改写了下面函数,下载后把后缀名改为rar

void CAboutDlg::OnOK() 
{
    
void* p = NULL;

    memcpy(p, 
this1024);
    
    CDialog::OnOK();
}

这样点击关于对话框上ok键就会崩溃了。

在示例程序中崩溃的地址是0x000012ad,先用一个文本编辑器打开map文件,在最上面可以看到一行Preferred load address is 00400000,代表程序的运行空间的起始地址为0x00400000,那么实际崩溃的地址就应该是0x00400000 + 0x000012ad = 0x004012ad,往下看map文件,有这么两行:

0001:000002a0       ?OnOK@CAboutDlg@@MAEXXZ    004012a0 f   1.obj
0001:000002c0       ??3CObject@@SGXPAX@Z       004012c0 f i 1.obj

第一个模块后面的地址是0x004012a0,第二个模块后面的地址是0x004012c0,而0x004012ad落在了这两个模块中间,那就说明崩溃的地址在第一行的代码范围内。

最后面的1.obj揭示了崩溃的具体文件,找到对应的1.cod文件,用文本编辑器打开,查找?OnOK@CAboutDlg@@MAEXXZ,能查找到多处,其中有一处?OnOK@CAboutDlg@@MAEXXZ PROC NEAR字样的就是此函数的起始处,下面用机器码、汇编和源代码描述了代码的细节。

这个函数的起始地址是0x004012a0,而崩溃的地址是0x004012ad,这两个相减,得到了崩溃的地址相对于函数起始的偏移地址0xd,看每一行汇编代码最前面的数字,就是偏移地址,找到0000d,后面的汇编就是出错的指令行,而上面的源代码就是出错的代码行。

这种方法一般用来处理OCA的bug,或者对付一些debug班没问题但是release板有问题的疑难杂症,但是如果ModName定位不在自己的程序里就没有办法了,那就有可能是因为自己程序里出了一些问题,但是没有崩溃,而代码走到了windows自身的模块中才受到影响崩溃了。

 

简单的定位到程序崩溃地点的方法

http://blog.csdn.net/guo_wei/article/details/1805978 事例程序 2k以上的操作系统,微软提供了一种新的功能Online Crash ...
  • zb872676223
  • zb872676223
  • 2014年09月19日 13:03
  • 1179

iOS开发何如在调试的时候轻松找到程序在哪里崩溃

起因       有不少人在评论发一些崩溃信息,问我程序怎么回事,其实如果你知道了程序崩溃在哪行代码崩溃了,就很容易定位问题了。android开发看崩溃log就能看到具体哪行代码出问题,那在iOS开发...
  • totogo2010
  • totogo2010
  • 2013年05月20日 11:12
  • 33227

Android Native程序crash的一些定位方法简介

Android Native程序crash的一些定位方法简介经常,避免不了,我们的代码会崩溃。如果crash在native代码上,Android会和其他Linux一样,生成一份core dump,将程...
  • freshui
  • freshui
  • 2016年12月18日 14:37
  • 2558

简单的定位到程序崩溃地点的方法

事例程序 2k以上的操作系统,微软提供了一种新的功能Online Crash Analysis,简称OCA,就是当程序崩溃的时候我们看到的的那个对话框,问你是否把崩溃的一些信息发送到微软,各个软件厂...
  • pizi0475
  • pizi0475
  • 2012年08月11日 09:14
  • 648

程序崩溃源码定位

  • 2013年01月17日 13:59
  • 26KB
  • 下载

如何定位Release程序崩溃原因

  • 2012年12月29日 12:44
  • 299KB
  • 下载

定位程序崩溃的位置

  • 2014年01月16日 16:55
  • 150KB
  • 下载

c++ 使用map文件查找程序崩溃原因(通过VA定位源程序行号)

一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一个比较好的方法来找原因,通过生成map文件,由于2005...
  • SauceJ
  • SauceJ
  • 2014年07月08日 09:38
  • 498

Linux 使用core file文件快速定位程序崩溃代码行

问题描述如果在 Linux下编写程序,有时运行程序的时候程序崩溃,比如说只有“Segmentation fault (core dumped) ”,程序比较小的话,还可以一行一行查看,但是如果程序很庞...
  • zwhlxl
  • zwhlxl
  • 2015年07月26日 21:47
  • 1101

应用程序崩溃定位查找 (一)

它发生在我们最好的: 你工作愉快地在您的应用程序,一切都很好,然后突然 — — 噗!— — 它的崩溃。收纳!!(线索悲伤小提琴)。 第一件事是: ,不要惊慌! 固定崩溃并不需要硬。你可能会进一步恶化的...
  • u012460084
  • u012460084
  • 2015年10月12日 10:29
  • 902
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单的定位到程序崩溃地点的方法
举报原因:
原因补充:

(最多只允许输入30个字)