一 什么是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 for Unit1(Unit1.pas) segment .text

    32 0001:00000A48    35 0001:00000A49     36 0001:00000A4E    37 0001:00000A54
    40 0001:00000A58    42 0001:00000A7D    43 0001:00000A8E    44 0001:00000ABD
    45 0001:00000AEE    49 0001:00000AF8    50 0001:00000B10    52 0001:00000B44
    52 0001:00000B4B

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

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

Delphi通过Map文件查找内存地址出错代码所在行的更多相关文章

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

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

  2. VS2005(vs2008,vs2010)使用map文件查找程序崩溃原因

    VS 2005使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一个比较好的 ...

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

    使用MAP文件快速定位程序崩溃代码行 =========================================================== 作者: lzmfeng(http://lz ...

  4. 使用Map文件查找崩溃信息

    简介 编写整洁的应用程序是一回事.但是当用户告诉你你的软件已经崩溃时,你知道在添加其他功能之前最好先解决这个问题.如果你够幸运的话,用户会有一个崩溃地址.这将大大有助于解决这个问题.但是你怎么能用这个 ...

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

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

  6. 通过map文件找程序崩溃的代码行

    一,配置vs 二,程序崩溃界面 // ConsoleApplication1.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include &l ...

  7. asp.net中使用Global.asax文件中添加应用出错代码,写入系统日志文件或数据库

    void Application_Error(object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 Exception objErr = Server.Ge ...

  8. AV 地址错误 map 文件 根据地址报错,查 Delphi 代码

    1. 首先需要设置程序生成 map 文件.Project -> Options -> Linker -> Map file , Detailed 2. 计算公式Edit2.Text ...

  9. 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

    这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ------------------------------------------------- ...

随机推荐

  1. ethtool 在 Linux 中的实现框架和应用

    转载:http://www.ibm.com/developerworks/cn/linux/1304_wangjy_ethtools/index.html?ca=dat- 王 俊元, 软件工程师, I ...

  2. HTML+CSS实例——漂亮的查询部件(一)

    一.参考网址:www.kuhnsjewelers.com 二.效果: 三.HTML <div id="search-box"> <asp:TextBox ID=& ...

  3. LeetCode 80

    Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates": What if duplicat ...

  4. [改善Java代码]构造函数尽量简化

    建议34: 构造函数尽量简化 我们知道在通过new关键字生成对象时必然会调用构造函数,构造函数的简繁情况会直接影响实例对象的创建是否繁琐.在项目开发中,我们一般都会制订构造函数尽量简单,尽可能不抛异常 ...

  5. 【几何模板加点小思路】hdu-4998 Rotate

    用几何模板敲的,也有直接公式推的,追求短代码的可以点右上角小红了...... 题意就是想想一个物体分别做绕某一点(给出坐标)旋转p度(给出角度)后,其位置等价于绕哪一点旋转多少度,输出该等价点及其等价 ...

  6. 转: Lua 语言 15 分钟快速入门

    看点: 1. 以很特殊的方式工,把Lua的语法全部输出一段,很容易让人记住..不错 转: http://blog.jobbole.com/70480/

  7. 【转】ora-00031:session marked for kill(标记要终止的会话)解决方法

    今天碰到一个问题,有一张表不能操作,很可能是被锁了,首先想到的是kill session,于是执行了下列的脚本找到是哪个session有问题: select object_name, machine, ...

  8. jquery 60秒倒计时(方法二)

    <script type="text/javascript">var wait=60;document.getElementById("btn"). ...

  9. 如何查看Windows8.1计算机体验指数评分

    如果你已经安装使用了Windows 8.1,你就会发现自从Vista时代开始的计算机体验评分消失了,在文章<微软取消Windows 8 计算机评分功能>中,我猜测了微软取消评分功能的可能原 ...

  10. 【转载】Android设计中的.9.png

      转载自:腾讯ISUX (http://isux.tencent.com/android-ui-9-png.html) 在Android的设计过程中,为了适配不同的手机分辨率,图片大多需要拉伸或者压 ...