一 什么是MAP文件

什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。

如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:

崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000

为什么要这样做呢?我们得到的崩溃地址都是由 偏移地址+ 基地址得来的,所以在计算行号的时候要把基地址减去,一般情况下,基地址的值是 0x00400000 。另外,由于一般的 PE 文件的代码段都是从 0x1000 偏移开始的,所以也必须减去 0x1000 。

二 Delphi 下生成MAP文件的方法

project   ->   options   ->   Linker   ->   Map   file   选择detailed。  生成的位置在Exe文件所在的目录。

三 例子

      代码

procedure TForm1.Button1Click(Sender: TObject);
var     
    I,   J:   Integer;
    p:   PChar;
begin
    I   :=   10
;
    J   :=   0
;
    p   :=
   nil;
    p^   :=   'A';   //   36行.  这里会报错

end;

运行时会报错

这里可以发现出错地址是:$00401A51

根据:      崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000

               =$00401A51 - $00400000 -$1000

                                    =$00000A51

用记事本打开生成的MAP文件
Line numbers forUnit1(Unit1.pas) segment .text

    320001:00000A48    350001:00000A49     36 0001:00000A4E    370001:00000A54
    400001:00000A58    420001:00000A7D    430001:00000A8E    440001:00000ABD
    450001:00000AEE    490001:00000AF8    500001:00000B10    520001:00000B44
    520001:00000B4B

那么,通过在MAP文件里查找小于或等于$00000A51的最大值就是,我们要得到的崩溃行偏移.

这样得到出错行在, Unit1单元的36行.  正好是这行:   p^   :=   'A';   //   36行.  这里会报错

建议给客户的时候不要带着map文件,map文件里记录着所有程序函数的名称及入口内存地址,太方便别人破解了。

转载于:https://www.cnblogs.com/yych/p/3316264.html

Delphi通过Map文件查找内存地址出错代码所在行相关推荐

  1. 问题-[Delphi]通过Map文件查找内存地址出错代码所在行

     一 什么是MAP文件       什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号.源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方.任何时候使用,不需要有额外的程序进行支持 ...

  2. 使用MAP文件快速定位程序崩溃代码行

    作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统 造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现 ...

  3. 使用MAP文件快速定位程序崩溃代码行(转)

    作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现程 ...

  4. Delphi处理高速文件上传下载的代码及思路

    Delphi处理高速文件上传下载的代码及思路 上传和下载是一对方向不同的概念,下面对应的客户端和服务器代码:掉个头,它就是下载:再掉个头,它就是上传. 一.思路 1.将大文件:分段(即常说的" ...

  5. 32查运行内存的map文件_linux内存管理

    概念先行 先理解内存管理中的几个概念:内存,主存,缓存,外存,虚拟内存,物理内存,虚拟地址,物理地址 外存: 计算机的外部存储,比如硬盘(机械硬盘.固态硬盘.混合硬盘),usb 内存: 用于计算机运行 ...

  6. ELF 文件 动态链接 - 地址无关代码(GOT)

    Linux 系统中,ELF动态链接文件被称为 动态共享对象(DSO,Dynamic Shared Object),简称共享对象 文件拓展名为".so" 动态链接下 一个程序可以被分 ...

  7. linux查看文件列表内存地址ll,linux指令之文件查看 ls

    1.linux文件结构 linux文件结构是树形的,根目录是 / , 其它所有文件都是在根目录下面的. 2.linux文件结构查看方式 一般使用的linux都是非图形化界面的(图形化界面安装时可选择, ...

  8. 萝卜游侠-一款搜索和修改内存地址的游戏辅助工具

    上次我发布的GameEnchanter也是一个强大的游戏修改工具.不知道的可以点GameEnchanter打开研究下.今天我就大家带来的是另一款游戏修改工具.萝卜游侠是一款搜索和修改内存地址的游戏辅助 ...

  9. Matlab替换A2L文件中的地址生成完整A2L文件的方法小结

    引言 基于模型的开发(MBD)方式在汽车电子嵌入式软件行业中发展迅速.关于其N多好处不去瞎说了,自然有mathwork的工作人员去宣传.基于模型的开发在模型生成代码的过程中,如果软件工程师在matla ...

  10. C++读某个内存地址对应的值

    C++读某个内存地址对应的值 举个栗子,这里的内存地址对应的是int类型,读取时候需要将地址,转化为int类型的指针,然后用*运算符取得该地址对应的值. 0x61fe08为我想要读的内存地址,代码如下 ...

最新文章

  1. 软件测试基础 - 测试覆盖率
  2. 细节:以为字符串不为空
  3. 区块链BaaS云服务(21)腾讯CCGP“跨链流程”
  4. debian 安装curl 很简单的一步完成
  5. [BUUCTF-pwn]——[HarekazeCTF2019]baby_rop
  6. 名企进名校精选IT人 07年毕业生就业看好
  7. GARFIELD@10-16-2004
  8. 使用 Go 实现 TLS socket server
  9. SinoBBD亮相全球云计算大会 彰显一体化云力量
  10. redo log 和undo log_MySQL 持久化保障机制-redo 日志
  11. 增强网络安全意识——如何5分钟破解校园网上网账号和密码
  12. 全网最完整金融时间序列模型+动态模型
  13. 【ARM】嵌入式 ARM Linux 下移植 USB 蓝牙、交叉编译 bluez 各种版本
  14. iphone/ipad 连接smb服务器,实现局域网内文件共享
  15. 常用软件的替代软件 (免费和自由软件)
  16. 最新AZ自动发卡网源码-全网首发
  17. 年轻人的第一次汉化APK(教程)
  18. 你应该知道的 89 个操作系统核心概念
  19. 韩乔生最牛的一次解说 (超级搞笑)
  20. 程序猿和测试媛——组合在一起的原因

热门文章

  1. php 五子棋源联机版_PHP五子棋服务器代码
  2. BAT中删除整个目录的办法
  3. 解决安卓全屏问题:关键在于如何隐藏状态栏
  4. 自己都看到满眼问题,还要请专业测试?
  5. 三班倒有害健康,建议六班倒
  6. html 中word的超链接,word中如何实现添加超链接的方法
  7. 猜数字游戏编程C语言0到9,【游戏编程】猜数字游戏(C语言)
  8. android.support.v7.app.actionbaractivity 报错
  9. Windows平台release版本内存泄漏检查办法
  10. python视频网站项目_Python项目04 视频网站数据清洗整理和结论研究