如何調試delphi的Access violation at address錯誤


1.什么是 MAP 文件?
簡單地講,MAP 文件是程序的全局符號、源文件和代碼行號信息的唯一的文本表示方法,它可以在任何地方、任何時候使用,不需要有額外的程序進行支持。

2.DELPHI下生成MAP文件的方法: 偶只知道下面兩種,如果誰知道其他的方法,敬請告知,多謝! 
生成詳細的MAP信息的方法: 
1). project -> options -> Linker -> Map file 選擇detailed. 
2). D:\Fred\Code\DELPHI\MyPas\ErrLineByAddr2>dcc32 -GD project1.dpr 

3.示例
我們的代碼為: 

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地址錯誤....我們這里就是要讓它崩潰,讓我讓你崩潰 ^_^ 
然后執行,點擊,然后出錯,我的機器上,崩潰地址為 00 44 d9 46。 

如果要查找代碼行號,需要使用下面的公式做一些十六進制的減法運算: 
崩潰行偏移 = 崩潰地址(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 

38 0001:0004C946 就是它了。。。unit1.pas的第38行!!去代碼里看一下,果然就是38行 ^_^..... 

 

實際情況下可能定位不是這么精確,按照計算的地址找不到相應的位置,那么就去找最后一個比獲得的異常地址小的那個函數,那就是出錯的函數。


4.補充
如果由地址查不到代碼行,則將 
Project -> Options -> Compiler 中的 Debugging 的 Use Debug DCUs 勾選上后編譯,
則將調用的系統文件均編譯到執行文件中,同時記錄在Map文件中.
這時在查找地址,不信找不到;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM