VC程序错误定位方法

原创 2005年03月30日 15:38:00

KB:Visual C++
Q196755 - HOWTO: Determine the Location of a Crash
如何定位程序崩溃的地方

概述
本文档说明如何根据错误消息中的地址来找到错误发生的地方。例如,某个用户报告使用RELEASE版程序时发生崩溃,唯一的信息就是发生错误的地址。

【技巧一:使用MAP文件】

    通过使用MAP文件,你可以定位包含错误代码的函数。要产生MAP文件,就要在工程选项中打开"/MAP"链接开关值,其设置步骤如下:
1、打开工程选项设置,设置RELEASE的选项。
2、选择"Link"页的"General"节,选择"Generate debug info"。
3、重新编译程序。

    举例来说,假设错误信息如下:

testcrash.exe - Application Error
The instruction at "0x004011a9" referenced memory at "0x00000000". The
memory could not be "written"

    错误地址为0x004011a9,检查MAP文件中的"Rva+Base"值(函数的起始位置),找到最匹配的位置。假设MAP文件内容如下:

   <... lines removed ...>
     Address            Publics by Value              Rva+Base   Lib:Object
  
    0001:00000000
   ?_GetBaseMessageMap@CTestcrashApp@@KGPBUAFX_MSGMAP@@XZ 00401000 f
   testcrash.obj
    0001:00000010       ?GetMessageMap@CTestcrashApp@@MBEPBUAFX_MSGMAP@@XZ
   00401010 f testcrash.obj
    0001:00000020       ??0CTestcrashApp@@QAE@XZ      00401020 f
   testcrash.obj
    0001:00000080       ??_ECTestcrashApp@@UAEPAXI@Z  00401080 f
   testcrash.obj
    0001:00000080       ??_GCTestcrashApp@@UAEPAXI@Z  00401080 f
   testcrash.obj
    0001:00000170       ?InitInstance@CTestcrashApp@@UAEHXZ 00401170 f
   testcrash.obj
    0001:00000210       ??1CTestcrashDlg@@UAE@XZ      00401210 f
   testcrash.obj
    0001:00000260       ?Serialize@CObject@@UAEXAAVCArchive@@@Z 00401260 f
   testcrash.obj
   <... lines removed ...>

    我们发现,函数?InitInstance@CTestcrashApp@@UAEHXZ的起始地址为00401170,下一个函数??1CTestcrashDlg@@UAE@XZ的起始地址,错误地址0x004011a9位于两者之间,那么可以断定错误出现在函数InitInstance中。

    使用MAP文件可以定位错误函数,但是它不能将范围缩小到发生错误的语句。

【技巧二:使用PDB文件】

    使用PDB文件可以准确定位错误发生的语句,其设置步骤如下:
1、保存在技巧一里面生成的MAP文件。
2、打开工程选项设置,设置RELEASE的选项。
3、选择"C/C++"页的"General"节,在"Debug Info"中选择"Program Database" ( 缺省为NULL )。
4、选择"Link"页的"General"节,选择"Generate debug info"。
5、选择"Link"页的"Customize"节,选择"Use program database"。
6、重新编译程序。
7、用Windiff或FC对照新产生的MAP文件和前面产生的MAP文件。
8、比较问题函数的"Rva+Base"是否发生变化,如果没有变化,跳过步骤9。
9、计算"Rva+Base"的差值,然后用这个值去修正错误地址,这样才得到新执行文件中的地址。

    现在你就有了一个PDB文件,它可以用来决定错误发生的具体位置,步骤如下:
1、在VC里面打开工程
2、按F11单步执行程序
3、按ALT+F9打开断点对话框
4、以错误的地址设置一个断点(注意:地址前面要加0x)
5、打开包含错误函数的文件,这时你就能看到断点所在就是错误的语句。

【参考】
    想了解调试技巧的更多内容,请参看VC在线文档中的“Using Visual C++ -- VC++ User's Guide -- Debugger”节。

vs2010利用map,cod文件定位崩溃代码行

利用map,cod文件定位崩溃代码行 利用vs2010 新建一个空的控制台项目,添加文件gtg.cpp,内容如下 void crash() {          inti=1;...
  • gwzz1228
  • gwzz1228
  • 2013年06月07日 11:20
  • 5719

VC6.0 通过崩溃地址中找到异常代码行

这是从“VC编程经验总结7”中转出来的借花献佛——如何通过崩溃地址找到出错的代码行作为程序员,我们平时最担心见到的事情是什么?是内存泄漏?是界面不好看?……错啦!我相信我的看法是不会有人反对的--那就...
  • mydeardingxiaoli
  • mydeardingxiaoli
  • 2014年03月03日 14:13
  • 3101

VC++小技巧-Output窗口输出定位 .

在使用VC++时,经常使用OutputDebugString往往Output窗口写一些调试信息,如果输出信息遵循某种格式,那么在Output窗口中点击相应输出文本就会跳到相应的代码行中。具体格式MSD...
  • cherish_2012
  • cherish_2012
  • 2014年05月09日 22:03
  • 1545

iOS开发怎么定位问题出错的代码位置

起因        有不少人在评论发一些崩溃信息,问我程序怎么回事,其实如果你知道了程序崩溃在哪行代码崩溃了,就很容易定位问题了。android开发看崩溃log就能看到具体哪行代码出问题,那在i...
  • ttf1993
  • ttf1993
  • 2015年07月23日 02:19
  • 1206

VC++内存泄漏的检测与定位

VC++内存泄漏的检测与定位 内存泄漏信息查看(MFC、非MFC) 位置定位(MFC、非MFC) 非MFC查看内存泄露信息:关键代码#include "crtdbg.h" //添加该头文件 _Crt...
  • xuleisdjn
  • xuleisdjn
  • 2016年11月09日 15:38
  • 1371

Java问题定位

一、摘要 由于硬件问题、系统资源紧缺或者程序本身的BUG,Java服务在线上不可避免地会出现一些“系统性”故障,比如:服务性能明显下降、部分(或所有)接口超时或卡死等。其中部分故障隐藏颇深,对运...
  • wodeyuer125
  • wodeyuer125
  • 2016年01月21日 19:22
  • 1864

XCode的 Stack Trace,调试时抛出异常,定位到某一行代码

在Xcode调试程序的时候,总是会出现不知道错误在什么地方的问题,很是捉急,现在又一个办法,可以具体定位到错误行的代码,试一下吧?超级好用 操作很简单: 1、在XCode界面中按cmd + 6快捷键,...
  • enuola
  • enuola
  • 2014年01月02日 18:17
  • 13521

VC++内存泄漏定位(依赖MFC)

今天调试程序,发现有内存泄漏但是没有提示具体是哪一行,搞得我很头疼。结果在网上搜索了一些资料,经自己实践后整理如下:       第一种:通过"OutPut窗口"定位引发内存泄漏的代码(下...
  • zhanglidn013
  • zhanglidn013
  • 2015年07月31日 22:53
  • 944

JavaScript调试技巧之:快速定位

赶紧总结一下JavaScript的调试技巧,这次首先是“快速定位”篇。 快速定位,其实就是快速定位程序的错误,所以也算是调试。这个在实际的码代码时往往比较实用。大多数情况下,你的js代码不多(少于1...
  • ladycode
  • ladycode
  • 2016年04月29日 11:01
  • 1689

使用MAP文件快速定位程序崩溃代码行

程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统造成巨大的损失。但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事。其实测试中出现程序崩...
  • xjbclz
  • xjbclz
  • 2016年06月27日 21:50
  • 690
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC程序错误定位方法
举报原因:
原因补充:

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