仅通过崩溃地址找出源代码的出错行

作为程序员,我们平时最担心见到的事情是什么?是内存泄漏?是界面不好看? ……错啦!我相信我的看法是不会有人反对的——那就是,程序发 生了崩溃!

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

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

Well,废话说完了,让我们开始! :)

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

好吧,既然 MAP 文件如此神奇,那么我们 应该如何生成它呢?在 VC 中,我们可以按下 Alt+F7 ,打开“Project Settings”选项页,选择 C/C++ 选项卡,并在最下面的 Project Options 里面输入: /Zd ,然后要选择 Link 选项卡,在最下面的 Project Options 里面输入: /mapinfo:lines 和 /map:PROJECT_NAME.map 。最后按下 F7 来编译生成 EXE 可执行文件和 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 //****************************************************************
02 //程序 名称:演示如何通过崩溃地址找出源代码的出错行
03 //作者:罗聪
04 //日期 :2003-2-7
05 //出处:http://www.luocong.com(老罗的缤纷天地)
06 //本 程序会产生“除0错误”,以至于会弹出“非法操作”对话框。
07 //“除0错误”只会在 Debug 版本下产生,本程序为了演示而尽量简化。
08 //注意事项:如欲转载,请保持本程序的完整,并注明:
09 //转载自 “老罗的缤纷天地”(http://www.luocong.com)
10 //****************************************************************
11
12 void Crash(void)
13 {
14 int i = 1;
15 int j = 0;
16 i /= j;
17 }
18
19 void main(void)
20 {
21 Crash();
22 }

时间: 2024-09-21 07:50:48

仅通过崩溃地址找出源代码的出错行的相关文章

对“仅通过崩溃地址找出源代码的出错行”一文的补充与改进

读了老罗的"仅通过崩溃地址找出源代码的出错行"(下称"罗文")一文后,感觉该文还是可以学到不少东西的.不过文中尚存在有些说法不妥,以及有些操作太繁琐的地方 .为此,本人在学习了此文后,在多次实验实践基础上,把该文中的一些内容进行补充与改进,希望对大家调试程序,尤其是release版本的程序有帮助 .欢迎各位朋友批评指正. 一.该方法适用的范围 在windows程序中造成程序崩溃的原因很多,而文中所述的方法仅适用与:由一条语句当即引起的程序崩溃.如原文中举的除数为零的

服务器-从图片上找出指向地址下载加密文件找潜在密钥

问题描述 从图片上找出指向地址下载加密文件找潜在密钥 分析一个文件服务器上的数据,但所有数据都是加密的,密钥无从获知.服务器上唯一没有被加密的文件是一张jpg图片,这是获取密钥的唯一途径.现在只知道记录密钥的方法是"KEY="这个前缀,等号后面即是这个密钥,要从图片中找出指向地址并从指向地址上下载的加密文件中找出潜藏的密钥.(整个文件只有一个KEY=开头的字符串,因此不会造成混淆:只要这一个办法,破解加密文件意义不大) 图片地址:http://range.jsxajs.cn:8080/

利用正则表达式找出文件里的所有邮件地址

package cn.com; //利用正则表达式找出文件里的所有邮件地址 //总结: //String mailreg="\\w+@\\w+\\.\\w+";此句错误 //它可以发现ava@sohu.com这种类型,但是无法发现ava@sohu.com.cn这种类型. //所以需要修改为String mailreg="\\w+@\\w+(\\.\\w+)+";因为\\.\\w+这个整体可以出现多次 import java.util.regex.*; import

如何在Linux中找出所有在线主机的IP地址

你可以在 Linux 的生态系统中找到很多网络监控工具,它们可以为你生成出网络中所有设备的摘要,包括它们的 IP 地址等信息. 然而,实际上有时候你只需要一个简单的命令行工具,运行一个简单的命令就能提供同样的信息. 本篇教程会向你展示如何找出所有连接到给定网络的主机的 IP 地址.这里我们会使用 Nmap 工具来找出所有连接到相同网络的设备的IP地址. Nmap (Network Mapper 的简称)是一款开源.强大并且多功能的探查网络的命令行工具,用来执行安全扫描.网络审计.查找远程主机的开

德国汉莎航空表示空客320原因很快能找出,高度仅一分钟就开始急坠

据"中央社"报道,德国汉莎航空公司(Lufthans)执行长史波表示,旗下廉价航空子公司德国之翼客机今天坠毁法国南部阿尔卑斯山区,有关事故原因的初步信息应该"很快"就可取得. 史波(Carsten Spohr)对当局在坠机现场寻获一个黑盒子一事表示满意.他说,汉莎航空和调查人员"会尝试找出原因,然后了解我们公司60年来最黑暗的一天是如何发生". 汉莎航空公司欧洲销售与服务副总裁柏伦巴哈稍早表示,这起坠机暂时朝意外事故方向处理,任何其他的说法纯属揣

轻松找出视频文件的真实地址

现在网上的影院非常 丰富, 但是许多新片都只提供http://www.aliyun.com/zixun/aggregation/18747.html">在线观看而不允许用户下载,而由于种种原因,网速又得不到保障,看起来断断续续地,非常影响心情. 经过我的一番探索, 终于找出几种可以得到在线视频文件的真实地址的方法. 一.查看源文件法 一些网站把视频文件直接内嵌在网页式播放器中,虽然没有"点击下载"地链接,但只要你查看一下网页的源文件,其真实地址就一览无余了,具体方法,打

在 Linux 中找出所有在线主机的 IP 地址

你可以在 Linux 的生态系统中找到很多网络监控工具,它们可以为你生成出网络中所有设备的摘要,包括它们的 IP 地址等信息. 然而,实际上有时候你只需要一个简单的命令行工具,运行一个简单的命令就能提供同样的信息. 本篇教程会向你展示如何找出所有连接到给定网络的主机的 IP 地址.这里我们会使用 Nmap 工具来找出所有连接到相同网络的设备的IP地址. Nmap (Network Mapper 的简称)是一款开源.强大并且多功能的探查网络的命令行工具,用来执行安全扫描.网络审计.查找远程主机的开

从黑客的角度来找出网络安全漏洞精简版

以下的文章主要向大家讲述的是从黑客的角度来来找出网络安全漏洞,其中也有都对用开源工具收集安全漏洞信息,从外部审视网络安全漏洞等相关内容的描述,以下就是文章的主要内容的纤细解析.作为企业安全管理员来说,当然希望企业拥有一个相对完美的系统,但在实际看来这是不可能的.往往某个系统或软件的漏洞就会被黑客所利用,正所谓师夷长技以制夷,通过黑客的眼光来审视网络安全性,往往可以发现很多潜在的安全漏洞.这样做不仅提供了审视你网络系统的不同视角,而且让你能够从你的 敌人,即黑客的角度来指导你采取最有效的网络安全措

使用 Visual Studio 分析器找出应用程序瓶颈

在过去十年间,涌现了许多新的软件技术和平台.每种新技术都要求掌握专门的知识才能创建出性能良好的应用程序.现在,由于各种 Internet 技术(如博客)使失望的用户可轻松地否定您的应用程序,因此您确实需要将性能放到首要位置.在计划早期,就应添加响应性能要求并创建原型来确定可能的技术限制.在整个开发过程中,还应衡量应用程序的各个性能方面以发现可能的性能下降,同时确保速度较慢情形下的测试人员文件并跟踪其错误. 即使拥有最好的计划,仍必须在产品开发过程中调查性能问题.在本文中,我们将向您展示如何使用