通過崩潰地址 MAP文件 找錯誤行數之Delphi版

以前看了   通過崩潰地址找錯誤行數之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...如果有不妥之處   敬請之處   多謝....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章