MAP文件和调试(VC)(从崩溃地址找出错源码位置)

来源:互联网 发布:东南大学网络 编辑:程序博客网 时间:2024/05/17 03:36
也是:一直听说,从未动手。

所以,用VC生成一下MAP文件,帮助调试。

一.步骤:

Project Settings->C/C++-> Project Options:
这里输入 /Zd,将在编译时生成行信息。

Project Settings->Link->Project Options:
/mapinfo:lines

/map:MapFileName.map
/mapinfo:exports

MapFileName是生成MAP文件的名字
第一个是生成行信息,第三个是加入导出信息。

这样就设置好了,编译出来的就有MAP文件了.

二.MAP文件:
写一个程序,编译出来:

#include <stdio.h>

int main(){
    int i = 2;
    int j ;
    scanf("%d",&j);
    i = 2;
    i = 3;
    i = 4;
    i = 5;
    i = 6;
    printf("%d",i/j);
    return 0 ;
}

然后打开MAP文件.
里面有各种全局符号,大概在文件的中间位置,有这样的东西:
Line numbers for .\Debug\4.obj(E:\pro\4\4.cpp) segment .text

     3 0001:00000010     4 0001:00000024     6 0001:0000002b     7 0001:0000003c
     8 0001:00000043     9 0001:0000004a    10 0001:00000051    11 0001:00000058

可以直接Ctrl+F找到程序文件名,我这里是4.cpp
这些就是代码偏移和对应的行号.

三.调试

就刚才的程序,运行,输个0,过一下出错框就来了,
我是VISTA,下面的详细信息是:
问题签名:
问题事件名称:    APPCRASH
应用程序名:    4.exe
应用程序版本:    0.0.0.0
应用程序时间戳:    499d5ade
故障模块名称:    4.exe
故障模块版本:    0.0.0.0
故障模块时间戳:    499d5ade
异常代码:    c0000094
异常偏移量:    00001063
OS 版本:    6.0.6001.2.1.0.768.3
区域设置 ID:    2052
其他信息 1:    38fc
其他信息 2:    db4f9c1c160faa4608f429ddffa01d6f
其他信息 3:    cb3b
其他信息 4:    e8ffb2a21d4a9ed7b258f1866c9d3db8

这个偏移就是要看的了。减去1000的代码段偏移。
就是63,再对照上面的行号和地址的列表
11 0001:00000058
这个是VC翻译的时候,第11行显然会对应多条指令。
这一指令群的开始地址是58.
这个是最接近63且比63小的地址,所以问题应该出在这一行上。
再看代码:
printf("%d",i/j);
发现这里有个除0错误。
0 0