======================================================
注:本文源代码点此下载
======================================================
无聊的时候翻了一下收藏夹,看到了“通过崩溃地址找错误行数之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^)/