【转】通过崩溃地址找错误行数之 Delphi 版
以前看了"通过崩溃地址找错误行数之 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 { { 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; p := nil; p^ := 'A'; end; end. 想必大家看到了, 会有返回 0 地址错误....我们这里就是要让它崩溃, 让我让你崩溃! ! ^_^ 然后执行 -> 点击 -> 然后出错 -> 我的机器上 -> 崩溃地址为 0044d946 如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算: 崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000 0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946 0004C946 就是它了,我们用 UltraEdit32 之类的工具打开.map 文件,
搜索"0004C94", 找到了,然后就找 0004c946 的那个地址,然后看到了: Line 37 numbers for Unit1(Unit1.pas) 38 41 41 segment .text 39 0001:0 // 38 // 32 //ShowMessage(IntToStr(I));
0001:0004C944 004C949
0001:0004C946 0001:0004C97C
0001:0004C983
O Yeah..<星际里面注射兴奋剂的声音 ^_^>.. "38 0001:0004C946"就是它了!!unit1.pas 的第 38 行!!去代码里看一下,果然就 是 38 行
通过 try...except 获得出错的行号 发布者:一剑飞霜
参考“通过崩溃地址找错误行数之
Delphi 版”想到另一个
问题,如果在代码中使用了 try...except 如何才能获得出错的行号呢? 通过查找上次执行的指令地址来确定行号或许能解决: 以下函数系摘录: function GetEIP: DWORD; stdcall; asm POP EAX PUSH EAX end; procedure Tform1.Button1Click(Sender: TObject); var p: PChar; begin p := nil; try p^ := 'A'; // 38 except on e: exception do begin ShowMessage(format('%.8x', [GetEIP()])); //此处获得是当前指令地址,使用“罗文” 方法可知行号为 41, //那么出错的行号呢?显然就是前 面一条指令对应的 3
8 end; end; end;
Line numbers for Unit1(Unit1.pas) segment .text 28 0001:00051974 36 0001:00051994 44 0001:00051A11 29 0001:00051975 37 0001:00051999 46 0001:00051A58 30 0001:00051976 38 0001:000519A7 46 0001:00051A5F 35 0001:00051978 41 0001:000519C8
0xc0000005 是应用程序初始化失败,应该是你的 IE 要去调用 Flash 时候造成的,和你的 IE 没什么大关系,你把你的 flash 卸载重装一遍 吧。