第一:先要让编译器生成MAP文件,方法:
project -> options -> Linker -> Map file 选择detailed。
第二:计算公式:
崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
以上公式的“基地址”可以在project -> options -> Linker中的memory size框中的IMAGE BASE中看到,我的是“00400000”。
然后编译,运行自己的程序,出现如图的崩溃时:

用公式可得出:0044E1CD -00400000-00001000=0004D1CD,这里的0004D1CD可能就是指向源代码中出错的行数。然后我们用UltraEdit等工具打开工程所在文件夹里的“Project1.map”文件(是不是叫project1.map,就看你的工程叫什么名字了),在里面查找比0004D1CD小,但最接近0004D1CD的一个字符串,找到的字符串所指向的数字就是出错的行数,如下图中,比0004D1CD小,但最接近0004D1CD的是0004D1CA,它是31,说明就是第31行出错:

下图是我源代码的载图,第30行把指针指向nil,第31行又向指针指向的地方写数据,程序当然崩溃,所以前面找到的第31行出错是正确的:

本文介绍了一种通过计算崩溃地址偏移并结合MAP文件来定位程序崩溃具体行数的方法。首先,需设置编译器生成详细MAP文件;其次,利用特定公式计算崩溃行偏移,进而确定错误行数。

2879

被折叠的 条评论
为什么被折叠?



