通过崩溃地址找错误行数之Delphi版 ^_^

beyondtkl 2004-11-30 12:46:22
以前看了 通过崩溃地址找错误行数之VC版 那时候还没用DELPHI
昨晚刚好又看到了 所以就试了一下DELPHI的,与大家共享 ^_^

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

DELPHI下生成MAP文件的方法:偶只知道下面两种,如果谁知道其他的方法 敬请告知 多谢
生成详细的MAP信息的方法
1. project -> options -> Linker -> Map file 选择detailed.
2. 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
{ Private declarations }
public
{ Public declarations }
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
减去后得到 0004c946 然后查找 0004c946
0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946 <= 后面列出的
0004C946 就是它了 我们用ultraedit32之类的工具打开 .map文件 搜索 0004C94,找到了,然后就找
<= 0004c946的那个地址 然后看到了
Line numbers for Unit1(Unit1.pas) segment .text

37 0001:0004C944 38 0001:0004C946 39 0001:0004C949 41 0001:0004C97C
41 0001:0004C983

o yeah..<星际里面注射兴奋剂的声音 ^_^>.. 38 0001:0004C946 就是它了。。。unit1.pas的第38行!!去代码里看一下 果然就是38行 ^_^.....

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

...全文
472 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfdream 2004-12-05
  • 打赏
  • 举报
回复
不错不错...

对了..我见过有的C++编制的程序,能够在出异常时候显示堆栈状态,就是不只是显示纯数字,而是同DELPHI调试环境中菜单'CALL STACK'窗口显示的那样一列方法名..
我还没有想出怎么做,楼主也想想?
jtg98g3 2004-12-05
  • 打赏
  • 举报
回复
少有的帖子呀!

怎么就让我给碰到了!

楼主真是在世神猪!
jinjazz 2004-12-03
  • 打赏
  • 举报
回复
你对这个板块的faq没有审核权限..郁闷
jinjazz 2004-12-03
  • 打赏
  • 举报
回复
加入faq
lw549 2004-12-01
  • 打赏
  • 举报
回复
靠!这样的资料vc的遍地都是,可惜Delphi的从来就没看到过


感谢楼主 ^_^
tfxg 2004-12-01
  • 打赏
  • 举报
回复
为了这样的好帖我们鼓掌,
beyondtkl 2004-11-30
  • 打赏
  • 举报
回复
顺便来点其他的冬冬 以前见过 刚突然想到的:

求婚:
男: 亲爱的,我爱你,嫁给我好吗?
女: 为什么要嫁给你<故意地 ^_^>
男: 我要你做世界上最最,哦不,第二幸福的人!
女:...<目光杀人中,欲走人...>
男: 因为我娶了你这么美丽靓水赞棒正PP漂亮温柔体贴聪明....的老婆,俺就是世界上第一幸福的淫瓦.....<娃哈哈哈哈>
女: ...<感动中>
男: ...<傻冒.还不给戴钻戒!!>

.............
嘿 看来偶有当编导 拍电影的潜力瓦。。。。
smiler007 2004-11-30
  • 打赏
  • 举报
回复
looklook
huangrenguang 2004-11-30
  • 打赏
  • 举报
回复
学习
nyf1220 2004-11-30
  • 打赏
  • 举报
回复
由于一般的 PE 文件的代码段都是从 0x1000 偏移开始的
…………

哎,那本讲PE的书还没看懂呢,要仔细研究了
nyf1220 2004-11-30
  • 打赏
  • 举报
回复
wo kao
终于看到一片好文章
leilu 2004-11-30
  • 打赏
  • 举报
回复
好东西,学习一下了。
hc0007 2004-11-30
  • 打赏
  • 举报
回复
学习 mark
Rail100 2004-11-30
  • 打赏
  • 举报
回复
3q
bee2518 2004-11-30
  • 打赏
  • 举报
回复
顶一下
心得多交流
crbb 2004-11-30
  • 打赏
  • 举报
回复
好东西 帮你顶
beyondtkl 2004-11-30
  • 打赏
  • 举报
回复
呵呵
一般情况下,基地址的值是 0x00400000 。另外,由于一般的 PE 文件的代码段都是从 0x1000 偏移开始的,所以也必须减去 0x1000 。

大家可以看到DELPHI 的设置
点击
project -> Linker -> Memory size 的Image base 默认为$00400000 这就是pe loader加载的时候默认加载到的基址。

确实 最近有看一下PE文件的格式,还不是很清楚.

谢啦 兄弟.
yeliming 2004-11-30
  • 打赏
  • 举报
回复
你去blog.csdn.net看看,上面有个开通你的blog,帐号密码和论坛一样。
alphax 2004-11-30
  • 打赏
  • 举报
回复
看把你兴奋得,,,随喜!

你知道$1000是啥东东不?你还没说明白
另外,map文件不是唯一的,dcu本身就可以,要不然Delphi IDE也没法找到发生异常的行了,
还有如果编译的时候带上turbo debug info,也可以从本身的tds找到行号
也有一些工具能够间接从map文件生成符号信息然后附加到目标模块(或者成为独立的一个文件)
beyondtkl 2004-11-30
  • 打赏
  • 举报
回复
对了 楼上的兄弟 CSDN里怎么申请BLOG呀 我倒有点想法。。。
加载更多回复(4)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧