[转]通过崩溃地址找错误行数之Delphi版


======================================================
注:本文源代码点此下载
======================================================

无聊的时候翻了一下收藏夹,看到了“通过崩溃地址找错误行数之delphi版”,但地址已经失效了。通过google找了一下,原来是csdn的beyondtkl(大龙驹)发在论坛中的。

整理一下,放在这里备份。

原地址:http://topic.csdn.net/t/20041130/12/3601416.htm

以前看了"通过崩溃地址找错误行数之vc版"那时候还没用delphi,昨晚刚好又看到了,所以就试了一下delphi的,与大家共享。^_^

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

delphi下生成map文件的方法:偶只知道下面两种,如果谁知道其他的方法,敬请告知,多谢!

生成详细的map信息的方法:

project -> options -> linker -> map file 选择detailed.

d:\fred\code\delphi\mypas\errlinebyaddr2>dcc32 -gd project1.dpr

我们的代码为:

unit unit1;

//{$d+,l+}

interface

uses

windows, messages, sysutils, variants, classes, graphics, controls, forms,

dialogs, stdctrls;

type

tform1 = class(tform)

button1: tbutton;

procedure button1click(sender: tobject);

private

{privatedeclarations}

public

{publicdeclarations}

end;

var

form1: tform1;

implementation

{$r *.dfm}

procedure tform1.button1click(sender: tobject);

var

i, j: integer;

p: pchar;

begin

i := 10;

j := 0;

//i := i div j;//32

//showmessage(inttostr(i));

p := nil;

p^ := 'a';//38

end;

end.

想必大家看到了,会有返回0地址错误....我们这里就是要让它崩溃,让我让你崩溃!!^_^

然后执行 -> 点击 -> 然后出错 -> 我的机器上 -> 崩溃地址为0044d946

如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:

崩溃行偏移 = 崩溃地址(crash address) - 基地址(imagebase address) - 0x1000

0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946

0004c946 就是它了,我们用ultraedit32之类的工具打开.map文件,搜索"0004c94",找到了,然后就找0004c946的那个地址,然后看到了:

linenumbersforunit1(unit1.pas)segment.text

370001:0004c944380001:0004c946390001:0004c949410001:0004c97c

410001:0004c983

o yeah....

"380001:0004c946"就是它了!!unit1.pas的第38行!!去代码里看一下,果然就是38行。^_^.....

共享ing...如果有不妥之处,敬请之处!多谢....


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值