通过崩溃地址找出源代码的出错行(未实践)

通过崩溃地址找出源代码的出错行
 
  在Windows XP下程序崩溃是会出现,“该程序执行了非法操作,即将关闭。请与你的软件供应商联系。”,有的时候,自己的程序在自己的机器上运行得好好的,但是到了别人的机器上就崩溃了;有时自己在编写和测试的过程中就莫名其妙地遇到了非法操作,但是却无法确定到底是源代码中的哪行引起的……是不是很痛苦呢?通过这个教程学习,就可以精确地定位到
  源代码中出错的那行了。
本方法可以在目前市面上任意一款编译器上面使用。
   首先必须生成程序的 MAP 文件。什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,
   不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。
下面实战演示:
1、设置生成MAP文件信息。
在此我先解释一下加入的参数的含义:


/Zd              表示在编译的时候生成行信息
/map[:filename]  表示生成 MAP 文件的路径和文件名
/mapinfo:lines  表示生成 MAP 文件时,加入行信息
/mapinfo:exports 表示生成 MAP 文件时,加入 exported functions (如果生成的是 DLL 文件,这个选项就要加上)


2、通过崩溃地址找到崩溃的函数。


ImageBase: 0X00400000
Rva: 0x00001a37


xp崩溃地址=Rav+ImageBase Address=0x00401a37
 ?OnBtnError@CMulThreadDlg@@IAEXXZ 00401a07 //以问号开头的函数名称都是 C++ 修饰的名称


3、定位到源代码中崩溃的行。


崩溃行偏移 = 崩溃地址 - 基地址 - 0x1000
         a37=0x00401a37-0x00400000-0x1000


第一个数字代表在源代码中的代码行号,第二个数是该代码行在所属的代码段中的偏移量。
16 0001:00000380 
在 MAP 文件的代码行信息,会看到不超过计算结果,但却最接近的数是 MulThreadDlg.cpp 文件中的:
233 0001:00000a33


通过行偏移a37找到了行号233,看一看源代码中是不是这一个出错。。。

猜你喜欢

转载自blog.csdn.net/u011337769/article/details/76096164
今日推荐