天天看点

release版本崩溃,如何定位代码行

一、设置编译产生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

release版本崩溃,如何定位代码行

二、利用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

release版本崩溃,如何定位代码行

利用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

release版本崩溃,如何定位代码行

由此推断出:崩溃发生在memleakstest.obj中的_main的第9行(*p = 0x2;)

继续阅读