2009-02-19 21:55
也是:一直听说,从未动手。
所以,用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错误。 OK,记到这里,以后用到了来翻 |