偏移
即可通用了。 仍以"罗文"中的例子为例:"罗文"中提到的在其崩溃程序的对应 map 文件 中,崩溃函数的编译结果为
0001:00000020 ?Crash@@YAXXZ 00401020 f CrashDemo。obj
对与上述结果,在使用我的公式时 ,"崩溃函数绝对地址"指 00401020, 函数相对偏 移指 00000020, 当崩溃地址= 0x0040104a 时, 则 崩溃行偏移 = 崩溃地址 崩溃函数起始地址+ 函数相对偏移 = 0x0040104a - 0x00401020 + 0x00000020= 0x4a,结果与"罗文"计算结果相同 。但这个公式更通用。
四、更好的定位崩溃语句位置的方法。 更好的定位崩溃语句位置的方法。 其实除了依靠 map 文件中的 Line numbers 信息最终定位出错语句行外,在 vc6 中我们还可以通过编译程序产生的对应的汇编语句,二进制码,以及对应 c/c++语句 为一体的"cod"文件来定位出错语句行 。先介绍一下产生这种包含了三种信息的"cod" 文件的设置方法:先点击菜单"Project"->"Settings。。。",弹出的属性页中选中 "C/C++"页 ,然后在"Category"中选则"Listing Files",再在"Listing file type"的 组合框中选择"Assembly,Machine code, and source"。接下去再通过一个具体 的例子来说明这种方法的具体操作。
图三 设置产生"cod"文件
准备步骤 1)产生崩溃的程序如下:
01 //****************************************************************02 //文件名称:crash。cpp03 //作用:
演示通过崩溃地址找出源代码的出错行 新方法 04 //作者: 伟功
通信 roc05 //日期: 2005-5-1606//******************************************************** ********07 void Crash1();08 int main(int argc,char* argv[])09 {10 Crash1();11 return 0;12 }1314
void Crash1()15 {16 char * p =(char*)100;17 *p=100;18 }
准备步骤 2)按本文所述设置产生 map 文件(不需要产生 Line numbers 信息)。 准备步骤 3)按本文所述设置产生 cod 文件。 准备步骤 4)编译。这里以 debug 版本为例(若是 release 版本需要将编译选项改为不 进行任何优化的选项,否则上述代码会因为优化时看作废代码而不被编译,从而看不到 崩溃的结果),编译后产生一个"exe"文件 ,一个"map"文件,一个"cod"文件。 运行此程序,产生如下如下崩溃提示:
图四 上面例子运行结果 排错步骤 1)定位崩溃函数。可以
查询 map 文件获得。我的机器编译产生的 map 文件 的部分如下:
Crash Timestamp is 42881a01 (Mon May 16 11:56:49 2005) Preferred load address is 00400000 Start Length Name Class0001:00000000 0000ddf1H .text CODE0001:0000ddf1 0001000fH .textbss CODE0002:00000000 00001346H .rdata DATA0002:00001346 00000000H .edata DATA0003:00000000 00000104H .CRT$XCA DATA0003:00000104 00000104H .CRT$XCZ DATA0003:00000208 00000104H .CRT$XIA DATA0003:0000030c 00000109H .CRT$XIC DATA0003:00000418 00000104H .CRT$XIZ DATA0003:0000051c 00000104H .CRT$XPA DATA0003:00000620 00000104H .CRT$XPX DATA0003:00000724 00000104H .CRT$XPZ DATA0003:00000828 00000104H .CRT$XTA DATA0003:0000092c 00000104H .CRT$XTZ DATA0003:00000a30 00000b93H .data DATA0003:000015c4 00001974H .bss DATA0004:00000000 00000014H .idata$2 DATA0004:00000014 00000014H .idata$3 DATA0004:00000028 00000110H .idata$4 DATA0004:00000138 00000110H .idata$5 DATA0004:00000248 000004afH .idata$6 DATAAddress Publics by Value Rva+Base Lib:Object0001:00000020 _main 00401020 f
Crash.obj0001:00000060 ?Crash1@@YAXXZ 00401060 f Crash.obj0001:000000a0 __chkesp 004010a0 f LIBCD:chkesp.obj0001:000000e0 _mainCRTStartup 004010e0 f LIBCD:crt0.obj0001:00000210 __amsg_exit 00401210 f LIBCD:crt0.obj0001:00000270 __CrtDbgBreak 00401270 f LIBC