通过崩溃地址找错误行数之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
我们的代码为:
  1. unit Unit1;
  2. //{$D+,L+}
  3. interface
  4. uses
  5. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, StdCtrls;
  7. type
  8. TForm1 = class(TForm)
  9. Button1: TButton;
  10. procedure Button1Click(Sender: TObject);
  11. private
  12. { Private declarations }
  13. public
  14. { Public declarations }
  15. end;
  16. var
  17. Form1: TForm1;
  18. implementation
  19. {$R *.dfm}
  20. procedure TForm1.Button1Click(Sender: TObject);
  21. var
  22. I, J: Integer;
  23. p: PChar;
  24. begin
  25. I := 10;
  26. J := 0;
  27. //I := I div J; // 32
  28. //ShowMessage(IntToStr(I));
  29. p := nil;
  30. p^ := 'A'; // 38
  31. end;
  32. end.
复制代码
想必大家看到了,会有返回0地址错误....我们这里就是要让它崩溃,让我让你崩溃!!^_^
然后执行 -> 点击 -> 然后出错 -> 我的机器上 -> 崩溃地址为0044d946
如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:

崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946
0004C946 就是它了,我们用UltraEdit32之类的工具打开.map文件,搜索"0004C94",找到了,然后就找0004c946的那个地址,然后看到了:
  1. Line numbers for Unit1(Unit1.pas) segment .text
  2. 37 0001:0004C944 38 0001:0004C946 39 0001:0004C949 41 0001:0004C97C
  3. 41 0001:0004C983
复制代码
O Yeah..<星际里面注射兴奋剂的声音 ^_^>..
"38 0001:0004C946"就是它了!!unit1.pas的第38行!!去代码里看一下,果然就是38行。^_^.....
共享ing...如果有不妥之处,敬请之处!多谢....
以前看了"通过崩溃地址找错误行数之VC版"那时候还没用DELPHI,昨晚刚好又看到了,所以就试了一下DELPHI的,与大家共享。^_^
什么是MAP文件?简单地讲,MAP文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。
DELPHI下生成MAP文件的方法:偶只知道下面两种,如果谁知道其他的方法,敬请告知,多谢!
生成详细的MAP信息的方法:

project -> options -> linker -> Map file 选择detailed.
D:/Fred/Code/DELPHI/MyPas/ErrLineByAddr2>dcc32 -GD project1.dpr
我们的代码为:
  1. unit Unit1;
  2. //{$D+,L+}
  3. interface
  4. uses
  5. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, StdCtrls;
  7. type
  8. TForm1 = class(TForm)
  9. Button1: TButton;
  10. procedure Button1Click(Sender: TObject);
  11. private
  12. { Private declarations }
  13. public
  14. { Public declarations }
  15. end;
  16. var
  17. Form1: TForm1;
  18. implementation
  19. {$R *.dfm}
  20. procedure TForm1.Button1Click(Sender: TObject);
  21. var
  22. I, J: Integer;
  23. p: PChar;
  24. begin
  25. I := 10;
  26. J := 0;
  27. //I := I div J; // 32
  28. //ShowMessage(IntToStr(I));
  29. p := nil;
  30. p^ := 'A'; // 38
  31. end;
  32. end.
复制代码
想必大家看到了,会有返回0地址错误....我们这里就是要让它崩溃,让我让你崩溃!!^_^
然后执行 -> 点击 -> 然后出错 -> 我的机器上 -> 崩溃地址为0044d946
如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:

崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946
0004C946 就是它了,我们用UltraEdit32之类的工具打开.map文件,搜索"0004C94",找到了,然后就找0004c946的那个地址,然后看到了:
  1. Line numbers for Unit1(Unit1.pas) segment .text
  2. 37 0001:0004C944 38 0001:0004C946 39 0001:0004C949 41 0001:0004C97C
  3. 41 0001:0004C983
复制代码
O Yeah..<星际里面注射兴奋剂的声音 ^_^>..
"38 0001:0004C946"就是它了!!unit1.pas的第38行!!去代码里看一下,果然就是38行。^_^.....
共享ing...如果有不妥之处,敬请之处!多谢....
以前看了"通过崩溃地址找错误行数之VC版"那时候还没用DELPHI,昨晚刚好又看到了,所以就试了一下DELPHI的,与大家共享。^_^
什么是MAP文件?简单地讲,MAP文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。
DELPHI下生成MAP文件的方法:偶只知道下面两种,如果谁知道其他的方法,敬请告知,多谢!
生成详细的MAP信息的方法:

project -> options -> linker -> Map file 选择detailed.
D:/Fred/Code/DELPHI/MyPas/ErrLineByAddr2>dcc32 -GD project1.dpr
我们的代码为:
  1. unit Unit1;
  2. //{$D+,L+}
  3. interface
  4. uses
  5. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, StdCtrls;
  7. type
  8. TForm1 = class(TForm)
  9. Button1: TButton;
  10. procedure Button1Click(Sender: TObject);
  11. private
  12. { Private declarations }
  13. public
  14. { Public declarations }
  15. end;
  16. var
  17. Form1: TForm1;
  18. implementation
  19. {$R *.dfm}
  20. procedure TForm1.Button1Click(Sender: TObject);
  21. var
  22. I, J: Integer;
  23. p: PChar;
  24. begin
  25. I := 10;
  26. J := 0;
  27. //I := I div J; // 32
  28. //ShowMessage(IntToStr(I));
  29. p := nil;
  30. p^ := 'A'; // 38
  31. end;
  32. end.
复制代码
想必大家看到了,会有返回0地址错误....我们这里就是要让它崩溃,让我让你崩溃!!^_^
然后执行 -> 点击 -> 然后出错 -> 我的机器上 -> 崩溃地址为0044d946
如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:

崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946
0004C946 就是它了,我们用UltraEdit32之类的工具打开.map文件,搜索"0004C94",找到了,然后就找0004c946的那个地址,然后看到了:
  1. Line numbers for Unit1(Unit1.pas) segment .text
  2. 37 0001:0004C944 38 0001:0004C946 39 0001:0004C949 41 0001:0004C97C
  3. 41 0001:0004C983
复制代码
O Yeah..<星际里面注射兴奋剂的声音 ^_^>..
"38 0001:0004C946"就是它了!!unit1.pas的第38行!!去代码里看一下,果然就是38行。^_^.....
共享ing...如果有不妥之处,敬请之处!多谢....
以前看了"通过崩溃地址找错误行数之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;  //  32
  //ShowMessage(IntToStr(I));
   p := nil;
   p^ := 'A';  //  38
end;
end.
复制代码想必大家看到了,会有返回0地址错误....我们这里就是要让它崩溃,让我让你崩溃!!^_^
然后执行 -> 点击 -> 然后出错 -> 我的机器上 -> 崩溃地址为0044d946
如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:
崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
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...如果有不妥之处,敬请之处!多谢....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值