通过崩溃地址 MAP文件 找错误行数之Delphi版

来源:互联网 发布:vb 和校验 编辑:程序博客网 时间:2024/04/29 22:29

以前看了   通过崩溃地址找错误行数之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...如果有不妥之处   敬请之处   多谢....

原创粉丝点击