以前看了 通過崩潰地址找錯誤行數之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...如果有不妥之處 敬請之處 多謝....
通過崩潰地址 MAP文件 找錯誤行數之Delphi版
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.