Delphi通过Map文件查找内存地址出错代码所在行
一 什么是MAP文件
什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。
如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:
崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
为什么要这样做呢?我们得到的崩溃地址都是由 偏移地址+ 基地址得来的,所以在计算行号的时候要把基地址减去,一般情况下,基地址的值是 0x00400000 。另外,由于一般的 PE 文件的代码段都是从 0x1000 偏移开始的,所以也必须减去 0x1000 。
二 Delphi 下生成MAP文件的方法
project -> options -> Linker -> Map file 选择detailed。 生成的位置在Exe文件所在的目录。
三 例子
代码
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
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文件查找内存地址出错代码所在行相关推荐
- 问题-[Delphi]通过Map文件查找内存地址出错代码所在行
一 什么是MAP文件 什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号.源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方.任何时候使用,不需要有额外的程序进行支持 ...
- 使用MAP文件快速定位程序崩溃代码行
作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统 造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现 ...
- 使用MAP文件快速定位程序崩溃代码行(转)
作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现程 ...
- Delphi处理高速文件上传下载的代码及思路
Delphi处理高速文件上传下载的代码及思路 上传和下载是一对方向不同的概念,下面对应的客户端和服务器代码:掉个头,它就是下载:再掉个头,它就是上传. 一.思路 1.将大文件:分段(即常说的" ...
- 32查运行内存的map文件_linux内存管理
概念先行 先理解内存管理中的几个概念:内存,主存,缓存,外存,虚拟内存,物理内存,虚拟地址,物理地址 外存: 计算机的外部存储,比如硬盘(机械硬盘.固态硬盘.混合硬盘),usb 内存: 用于计算机运行 ...
- ELF 文件 动态链接 - 地址无关代码(GOT)
Linux 系统中,ELF动态链接文件被称为 动态共享对象(DSO,Dynamic Shared Object),简称共享对象 文件拓展名为".so" 动态链接下 一个程序可以被分 ...
- linux查看文件列表内存地址ll,linux指令之文件查看 ls
1.linux文件结构 linux文件结构是树形的,根目录是 / , 其它所有文件都是在根目录下面的. 2.linux文件结构查看方式 一般使用的linux都是非图形化界面的(图形化界面安装时可选择, ...
- 萝卜游侠-一款搜索和修改内存地址的游戏辅助工具
上次我发布的GameEnchanter也是一个强大的游戏修改工具.不知道的可以点GameEnchanter打开研究下.今天我就大家带来的是另一款游戏修改工具.萝卜游侠是一款搜索和修改内存地址的游戏辅助 ...
- Matlab替换A2L文件中的地址生成完整A2L文件的方法小结
引言 基于模型的开发(MBD)方式在汽车电子嵌入式软件行业中发展迅速.关于其N多好处不去瞎说了,自然有mathwork的工作人员去宣传.基于模型的开发在模型生成代码的过程中,如果软件工程师在matla ...
- C++读某个内存地址对应的值
C++读某个内存地址对应的值 举个栗子,这里的内存地址对应的是int类型,读取时候需要将地址,转化为int类型的指针,然后用*运算符取得该地址对应的值. 0x61fe08为我想要读的内存地址,代码如下 ...
最新文章
- 软件测试基础 - 测试覆盖率
- 细节:以为字符串不为空
- 区块链BaaS云服务(21)腾讯CCGP“跨链流程”
- debian 安装curl 很简单的一步完成
- [BUUCTF-pwn]——[HarekazeCTF2019]baby_rop
- 名企进名校精选IT人 07年毕业生就业看好
- GARFIELD@10-16-2004
- 使用 Go 实现 TLS socket server
- SinoBBD亮相全球云计算大会 彰显一体化云力量
- redo log 和undo log_MySQL 持久化保障机制-redo 日志
- 增强网络安全意识——如何5分钟破解校园网上网账号和密码
- 全网最完整金融时间序列模型+动态模型
- 【ARM】嵌入式 ARM Linux 下移植 USB 蓝牙、交叉编译 bluez 各种版本
- iphone/ipad 连接smb服务器,实现局域网内文件共享
- 常用软件的替代软件 (免费和自由软件)
- 最新AZ自动发卡网源码-全网首发
- 年轻人的第一次汉化APK(教程)
- 你应该知道的 89 个操作系统核心概念
- 韩乔生最牛的一次解说 (超级搞笑)
- 程序猿和测试媛——组合在一起的原因
热门文章
- php 五子棋源联机版_PHP五子棋服务器代码
- BAT中删除整个目录的办法
- 解决安卓全屏问题:关键在于如何隐藏状态栏
- 自己都看到满眼问题,还要请专业测试?
- 三班倒有害健康,建议六班倒
- html 中word的超链接,word中如何实现添加超链接的方法
- 猜数字游戏编程C语言0到9,【游戏编程】猜数字游戏(C语言)
- android.support.v7.app.actionbaractivity 报错
- Windows平台release版本内存泄漏检查办法
- python视频网站项目_Python项目04 视频网站数据清洗整理和结论研究