AV 地址错误 map 文件 根据地址报错,查 Delphi 代码
2015-08-21 17:52
549 查看
1. 首先需要设置程序生成 map 文件。
Project -> Options -> Linker -> Map file , Detailed
2. 计算公式
Edit2.Text := IntToHex(StrToInt('$'+ Edit1.Text) - StrToInt('$00400000') - StrToInt('$00001000'), 8) ;
将看到的地址错误,输入到 Edit1 中。
3. 从 Map 文件中查这个地址。
一般直接查是找不到的。根据获得的 Edit2 中的值。删掉最后 1 位,或者 2 位,查。
得到的第一个不大于 Edit2 中值的地方,就是我们要的。
如果能找到函数名,根据这个函数名对应的“完整”的地址,再查一次,可以得到代码行数。
4. 这种方法并非非常靠谱。找不到,或者直接找到更底层的代码位置。也是很正常的。
----------------------------------------------
详解二
什么是MAP文件?简单地讲,MAP文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。
DELPHI下生成MAP文件的方法:偶只知道下面两种,如果谁知道其他的方法 敬请告知 多谢
生成详细的MAP信息的方法
1. project -> options -> Linker -> Map file 选择detailed.
2. D:\Fred\Code\DELPHI\MyPas\ErrLineByAddr2>dcc32 -GD project1.dpr
我们的代码为:
// 想必大家看到了 会有返回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行 ^_^.....
另外,map文件不是唯一的,dcu本身就可以,要不然Delphi IDE也没法找到发生异常的行了,
还有如果编译的时候带上turbo debug info,也可以从本身的tds找到行号
也有一些工具能够间接从map文件生成符号信息然后附加到目标模块(或者成为独立的一个文件)
大家可以看到DELPHI 的设置
点击
project -> Linker -> Memory size 的Image base 默认为$00400000 这就是pe loader加载的时候默认加载到的基址。
参考:http://www.cnblogs.com/key-ok/p/3394328.html
Project -> Options -> Linker -> Map file , Detailed
2. 计算公式
Edit2.Text := IntToHex(StrToInt('$'+ Edit1.Text) - StrToInt('$00400000') - StrToInt('$00001000'), 8) ;
将看到的地址错误,输入到 Edit1 中。
3. 从 Map 文件中查这个地址。
一般直接查是找不到的。根据获得的 Edit2 中的值。删掉最后 1 位,或者 2 位,查。
得到的第一个不大于 Edit2 中值的地方,就是我们要的。
如果能找到函数名,根据这个函数名对应的“完整”的地址,再查一次,可以得到代码行数。
4. 这种方法并非非常靠谱。找不到,或者直接找到更底层的代码位置。也是很正常的。
----------------------------------------------
详解二
什么是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); 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行 ^_^.....
另外,map文件不是唯一的,dcu本身就可以,要不然Delphi IDE也没法找到发生异常的行了,
还有如果编译的时候带上turbo debug info,也可以从本身的tds找到行号
也有一些工具能够间接从map文件生成符号信息然后附加到目标模块(或者成为独立的一个文件)
大家可以看到DELPHI 的设置
点击
project -> Linker -> Memory size 的Image base 默认为$00400000 这就是pe loader加载的时候默认加载到的基址。
参考:http://www.cnblogs.com/key-ok/p/3394328.html
相关文章推荐
- Delphi编程获取系统当前进程、窗口句柄、文件属性以及程序运行状态(8种应用)
- Delphi 代码创建控件与事件动态绑定
- Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码)
- Delphi消息的广播方式(先RegisterWindowMessage,后SendMessage HWND_BROADCAST,最后改写接收窗口的WndProc)
- Delphi 类成员的默认访问权限(用RTTI检测)
- delphi截屏
- delphi 回调函数与函数指针
- DelphiAdo Update Criteria
- delphi将图片存储到sql server 2005
- delphi将汉字转为首字母
- delphi listview自绘图形
- delphi开发学习五:QuickReoprt报表控件使用实例
- Delphi如何从内存流中判断图片格式,MemoryStream
- 开发支付宝支付用DELPHI实现 RSA签名
- delphi编程如何判断图片文件的真实类型?
- Delphi中的for循环本质详解
- 给各位使用delphi借助CEF开发的朋友一个帮助
- delphi开发学习四:TClientDataSet与TDataSetProvider控件使用实例
- delphi TMemoryStream对象用法
- Delphi-string转pbyte的方法——Move函数!