推广 热搜:   中国  未来  基金  系统  行业  设备  政策  快速  教师 

如何使用map和cod文件定位程序崩溃位置

   日期:2024-12-11     作者:caijiyuan    caijiyuan   评论:0    移动:http://mip.tpjde.com/news/3232.html
核心提示:程序或者dll在别的电脑上运行的时候发生崩溃,很难定位位置。我所知道的有两种方法可以快速定位,一种靠dump和pdb文

程序或者dll在别的电脑上运行的时候发生崩溃,很难定位位置。我所知道的有两种方法可以快速定位,一种靠dump和pdb文件,另一种靠map和cod文件。这里讲第二种方法。

如何使用map和cod文件定位程序崩溃位置

这里简单写一段会崩溃的代码。工程名为sample。

 
 

设置工程属性,以便生成cod文件。

在这里插入图片描述

设置工程属性,以便生成map文件。

在这里插入图片描述
运行后可在samplesampleDebug下发现sample.cod文件。
在这里插入图片描述
sampleDebug下发现sample.map文件。
在这里插入图片描述

双击运行sample.exe文件,会立即崩溃,出现这个弹窗。
在这里插入图片描述

关键信息是异常偏移:113f0。
假如错过了这个弹窗,可以通过控制面板-》系统和安全-》管理工具.查看事件日志-》自定义视图下的管理事件查看。根据大概时间和程序名字就可以找到相关信息。
在这里插入图片描述

打开map文件,开头可以看到这部分。
在这里插入图片描述
Preferred load address是该模块的首选加载地址。00400000+000113f0=004113f0,这是具体崩溃的代码的地址。
往下看可以看到这些。
在这里插入图片描述
Address表示分段地址,0000、0001、0002是段号,后面的是段内偏移地址。

具体分析一段。在这里插入图片描述
这里_wmain的Rva+base为00411410,base为前面说到的Preferred load address,也就是00400000。
Rva为Relative Virtual Address,称为相对虚拟地址。Rva=00411410-00400000=00011410。也就是说相对于基地址的偏移为00011410。

也就是说Address0002:00000410=00011410。由此可知0002段的起始地址为00011410-00000410=00011000。
f说明是函数信息。sample.obj说明这个函数来自sample.obj,由它链接成.exe文件。

前面知道崩溃地址是004113f0,我们找Rva+base中第一个比004113f0大的那一行,它的前一行就是崩溃的函数。
在这里插入图片描述
也就是004113c0。我们知道这个函数来自于sample.obj文件,它由sample.pp编译成,所以我们下一步查看sample.cod文件。

004113f0-004113c0=30。
我们搜函数的名字?say@Test@@QAEXXZ,定位到这个地方
在这里插入图片描述

这里的00001、00003表示偏移量,10:void say()表示这段代码的行号为10。这段代码会被处理为下面的汇编命令。我们只要找偏移量为30的
前面的那段代码int b=10/a就是崩溃的代码了,行号是12。

参考
1.map 文件的使用
2.vs生成的map文件详解
3.VS 2005/2008使用map文件查找程序崩溃原因

本文地址:http://www.tpjde.com/news/3232.html    推平第 http://www.tpjde.com/ , 查看更多
 
 
更多>同类行业资讯
0相关评论

新闻列表
企业新闻
推荐企业新闻
推荐图文
推荐行业资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2023001713号