当应用程序运行出错,如下图,如何找到一个比较好的方式,查找产生问题的原因呢?
**答案:**通过MAP文件和cod文件来查找崩溃的代码位置。
一、什么是Map文件
map文件是通过编译器编译之后,集程序、数据及IO空间的一种映射文件。
遇到内存越界,或溢出的情况,通过map文件可以知道函数大小,入口地址等一些重要信息。
二、定位错误位置步骤
1.VS环境下通过map和cod定位错误步骤
(1)编写测试工程
(2) VS编译器需要配置项
(3)编译项目后,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文件生成路径