应用程序(VS程序,Qt 编译)奔溃,通过map和cod查找问题原因

当应用程序运行出错,如下图,如何找到一个比较好的方式,查找产生问题的原因呢?
图1

**答案:**通过MAP文件和cod文件来查找崩溃的代码位置

一、什么是Map文件

map文件是通过编译器编译之后,集程序、数据及IO空间的一种映射文件。
遇到内存越界,或溢出的情况,通过map文件可以知道函数大小,入口地址等一些重要信息。

二、定位错误位置步骤

1.VS环境下通过map和cod定位错误步骤

(1)编写测试工程

在这里插入图片描述

(2) VS编译器需要配置项

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(3)编译项目后,map 文件和cod文件生成路径

map文件所在位置
cod文件所在位置

(4)运行程序,查找错误偏移量的两种方式

错误提示框

在这里插入图片描述
从上面截图,可以看出,程序崩溃地址为:0x00001006

(5)通过map和cod文件定位程序错误位置

在这里插入图片描述
从map文件里,可以看到地址优先推荐地址为 0x00400000,可以理解为程序的起始运行的地址。

起止地址 + 奔溃地址 = 程序内部报错地址
0x00400000 + 0x00001006 = 0x00401006
定位出错函数:
从map文件里,查找到地址00401010是 第一处 大于 *0x00401006的位置,那么崩溃就位于ppppp函数中,即程序内部奔溃地址x00401000
在这里插入图片描述
定位Cod文件的出错位置:
函数内偏移量 = 程序内部报错地址 - 程序内部奔溃地址
= 0x00401006 - 0x00401000= 0x0006
崩溃语句在 cod 文件中的相对偏移 = 崩溃函数在 cod 文件中相对偏移 + 函数内偏移量
= 0x0000 + 0x0006

2.Qt环境下如何配置生成map 文件和cod文件?

(1)Qt Creater编译器需要配置项

在这里插入图片描述
配置信息代码示例如下:

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
win32:contains(QMAKE_CC,cl){
#这两行是为了不出现编译时出现codecvt<char>xxxx的错误
    QMAKE_CXXFLAGS -= -Zc:wchar_t-
    QMAKE_CXXFLAGS += -Zc:wchar_t
#这个参数为了生成COD文件
    QMAKE_CXXFLAGS += -FAcs
}
win32:contains(QMAKE_LINK, link){
#这个参数为了生成MAP文件
    QMAKE_LFLAGS += /MAP
#这个参数为了能导出链接库的导出函数
    QMAKE_LFLAGS += /MAPINFO:EXPORTS
}

在这里插入图片描述

在这里插入图片描述

函数或子程序中局部变量数组越界付值,造成函数或子程序返回地址遭覆盖,从而造成函数或子程序返回时崩溃

(2)map 文件和cod文件生成路径

在这里插入图片描述
在这里插入图片描述

(3)运行程序,查找错误偏移量的两种方式

(4)通过map和cod文件定位程序错误位置

三、发现问题,暂时还没解决

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值