现在的位置: 首页 > 综合 > 正文

利用MAP文件精确定位代码中出错的代码行

2013年04月18日 ⁄ 综合 ⁄ 共 1298字 ⁄ 字号 评论关闭

程序,我最担心到的事情是什?是内存泄漏?是界面不好看?……啦!我相信我的看法是不会有人反——那就是,程序生了崩

程序行了非法操作,即将关闭与你的件供系。,呵呵, M$ 名言,恐怕就是程序最担心到的西了。有的候,自己的程序在自己的机器上运行得好好的,但是到了人的机器上就崩了;有自己在写和测试程中就莫名其妙地遇到了非法操作,但是却无法确定到底是源代中的哪行引起的……是不是很痛苦呢?不要,本文可以帮助你走出这种困境,甚至你从此之后可以自豪地要求用把崩地址告你,然后你就可以精确地定位到源代中出的那行了。(很神奇吧?呵呵。)

首先我必须强调的是,本方法可以在目前市面上任意一款编译器上面使用。但是我只熟悉 M$  VC  MASM ,因此后面的部分只介如何在两个编译器中实现请读者自行融会通,掌握在编译器上使用的方法。

 

首先必生成程序的 MAP 文件。什 MAP 文件?简单 MAP 文件是程序的全局符号、源文件和代行号信息的唯一的文本表示方法,它可以在任何地方、任何候使用,不需要有外的程序行支持。而且,是唯一能找出程序崩的地方的救星。

们应该如何生成MAP文件呢?在 VC 中,我可以按下 Alt+F7,打Project Settings”选项页选择 C/C++ 选项卡,并在最下面的 Project Options 里面入:/Zd ,然后要选择 Link 选项卡,中“Generate mapfile”复选框,并在最下面的 Project Options 里面入:/mapinfo:lines,表示生成 MAP 文件,加入行信息。最后按下 F7 编译生成 EXE 行文件和 MAP 文件,此可以在工程的Debug下找到刚刚生成的MAP文件,文件名“工程名.map”

 MASM 中,我编译接参数,我通常是这样做的:

rc %1.rc
ml /c /coff /Zd %1.asm
link /subsystem:windows /mapinfo:exports /mapinfo:lines /map:%1.map %1.obj %1.res 

把它保存成 makem.bat ,就可以在命令行 makem filename 编译生成 EXE 行文件和 MAP 文件了。

在此我先解一下加入的参数的含

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

OK,通上面的步骤,我得到了 MAP 文件,那们该如何利用它呢?

简单例入手,你的 VC ,新建这样一个文件:

01  //******************************

抱歉!评论已关闭.