一、设置编译产生map文件的方法(利用MAP文件)
在vc6的IDE中有产生map文件的配置选项的。操作如下:先点击菜单"Project"->"Settings。。。",弹出的属性页中选中"Link"页,确保在"category"中选中"General",最后选中"Generate mapfile"的可选项。
二、定位崩溃语句的方法(利用COD文件)
在vc6中我们还可以通过编译程序产生的对应的汇编语句,二进制码,以及对应c/c++语句为一体的"cod" 文件来定位出错语句行。先介绍一下产生这种包含了三种信息的"cod"文件的设置方法:先点击菜单"Project"->"Settings。。。",弹出的属性页中选中"C/C++"页 ,然后在"Category"中选则"Listing Files",再在"Listing file type"的组合框中选择"Assembly,Machine code, and source"
三、定位崩溃函数
在map文件中,假设崩溃地址0x00401082,小于此地址中最接近的地址为0x00401060,则其对应的函数名即为崩溃函数。
崩溃偏移地址 = 崩溃语句地址 - 崩溃函数的起始地址=0x00401082 - 0x00401060 = 0x22
四、定位崩溃行
在COD文件中,加上崩溃函数在cod文件中相对偏移为0x103
崩溃语句在cod文件中的相对偏移 = 崩溃函数在cod文件中相对偏移 + 崩溃偏移地址 = 0x103+0x22 = 0x125
在 崩溃语句在cod文件中的相对偏移(0x125) 前面的第一条c语句即为崩溃语句。
举例:
一、崩溃语句地址:0x00401202
二、利用MAP文件定位函数:(红色标出的部分,第三列代表函数地址,_main函数的地址是最后一个小于崩溃地址的,故而崩溃函数为memleakstest.obj中的_main)
0001:000001e0 _main 004011e0 f memleakstest.obj
0001:00000220 [email protected]@Z 00401220 f i StdAfx.obj
崩溃函数的起始地址:0x004011e0
崩溃偏移地址= 0x00401202 - 0x004011e0 = 0x22
利用COD文件定位代码行:(memleakstest.cod中搜索_main)
_main PROC NEAR ; COMDAT
; 6 : {
00000 55 push ebp
崩溃函数在cod文件中相对偏移 = 0x00000
崩溃语句在cod文件中的相对偏移 = 0x00000 + 0x22 = 0x00022
; 9 : *p = 0x2;
0001f 8b 45 fc mov eax, DWORD PTR _p$[ebp]
00022 c6 00 02 mov BYTE PTR [eax], 2
由此推断出:崩溃发生在memleakstest.obj中的_main的第9行(*p = 0x2;)