异常地址分析

上传人:ji****72 文档编号:37686850 上传时间:2018-04-20 格式:DOCX 页数:16 大小:187.61KB
返回 下载 相关 举报
异常地址分析_第1页
第1页 / 共16页
异常地址分析_第2页
第2页 / 共16页
异常地址分析_第3页
第3页 / 共16页
异常地址分析_第4页
第4页 / 共16页
异常地址分析_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《异常地址分析》由会员分享,可在线阅读,更多相关《异常地址分析(16页珍藏版)》请在金锄头文库上搜索。

1、1、VC 下发布的下发布的 Release 版程序的异常捕捉版程序的异常捕捉VC 下发布的 Release 版程序的异常捕捉- -寻找 Release 版程发生异常退出的地方比 Debug 版麻烦得多。发生异常的时候 windows 通常会弹出一个错误对话框,点击详细信息,我们能获得出错的地址和大概的出错信息,然后可以用以下办法分析我们的程序。 一. 用 MAP 文件定位异常代码位置。 1. 如何生成 map 文件 打开“Project Project Settings”,选择 C/C+ 选项卡,在“Debug Info”栏选择“Line Numbers Only”(或者在最下面的 Proje

2、ct Options 里面输入:/Zd),然后要选择 Link 选项卡,选中“Generate mapfile”复选框,并再次编辑 Project Options,输入:/mapinfo:lines,以便在 MAP 文件中加入行信息。然后编译工程则可以在输出目录得到同名的.map 文件。 2. 使用 map 文件定位发生异常的代码行 编译得到的 map 文件可以用文本方式打开,大致是这样的格式:(括号内是 PomeloWu 填加的注释) 0729 (工程名) Timestamp is 42e9bc51 (Fri Jul 29 14:19:13 2005) (时间戳) Preferred loa

3、d address is 00400000 (基址) (Data 段描述,省略) Address Publics by Value Rva+Base Lib:Object 0001:00000000 ?_GetBaseMessageMapC0729AppKGPBUAFX_MSGMAPXZ 00401000 f 0729 dot obj(这一行开始是函数信息,下面省略)Line numbers for .ReleaseShowDlg.obj(C:0729ShowDlg.cpp) segment .text24 0001:00003f90 28 0001:00003fce 29 0001:0000

4、3fd1 30 0001:00003fd4(行号信息,前面的数字是行号,后一个数字是偏移量,下面省略)在获得程序异常的地址以后,首先通过函数信息部分定位出错的 OBJ 和函数。做法是用获得的异常地址与 Rva+Base 栏地址进行比较(Rva,偏移地址;Base,基址)。找到最后一个比获得的异常地址小的那个函数,那就是出错的函数。 之后,用获得的异常地址减去该函数的 Rva+Base,就得到了异常行代码相对于函数起始地址的偏移。在“Line number for”部分找到相对应的模块,并把其后的行号信息与上面减得的偏移量对比,找到最接近的一个,前面的行号大致就是目标行了。 重剑点评: 上面这两

5、行灰掉的有问题,看下面的计算方法吧!怎样使用 Map 文件进行查错 首先必须生成程序的 MAP 文件。什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。好吧,既然 MAP 文件如此神奇,那么我们应该如何生成它呢?在 VC 中,我们可以按下 Alt+F7 ,打开“Project Settings”选项页,选择 C/C+ 选项卡,并在最下面的 Project Options 里面输入:/Zd ,然后要选择 Link 选项卡,在最下面的 Pro

6、ject Options 里面输入: /mapinfo:lines 和 /map:PROJECT_NAME.map 。最后按下 F7 来编译生成 EXE 可执行文件和 MAP 文件。在此我先解释一下加入的参数的含义:/Zd 表示在编译的时候生成行信息/map:filename 表示生成 MAP 文件的路径和文件名/mapinfo:lines 表示生成 MAP 文件时,加入行信息/mapinfo:exports 表示生成 MAP 文件时,加入 exported functions (如果生成的是 DLL 文件,这个选项就要加上) OK,通过上面的步骤,我们已经得到了 MAP 文件,那么我们该如何

7、利用它呢?让我们从简单的实例入手,请打开你的 VC ,新建这样一个文件:01 /*02 /程序名称:演示如何通过崩溃地址找出源代码的出错行03 /作者:罗聪04 /日期:2003-2-705 /出处:http:/(老罗的缤纷天地)06 /本程序会产生“除 0 错误”,以至于会弹出“非法操作”对话框。07 /“除 0 错误”只会在 Debug 版本下产生,本程序为了演示而尽量简化。08 /注意事项:如欲转载,请保持本程序的完整,并注明:09 /转载自“老罗的缤纷天地”(http:/)10 /*11 12 void Crash(void)13 14 int i = 1;15 int j = 0;1

8、6 i /= j;17 18 19 void main(void)20 21 Crash();22 很显然本程序有“除 0 错误”,在 Debug 方式下编译的话,运行时肯定会产生“非法操作”。好,让我们运行它,果然,“非法操作”对话框出现了,这时我们点击“详细信息”按钮,记录下产生崩溃的地址-在我的机器上是 0x0040104a 。再看看它的 MAP 文件:(由于文件内容太长,中间没用的部分我进行了省略)CrashDemoTimestamp is 3e430a76 (Fri Feb 07 09:23:02 2003)Preferred load address is 00400000Star

9、t Length Name Class0001:00000000 0000de04H .text CODE0001:0000de04 0001000cH .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$

10、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 DATA000

11、4: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 ?CrashYAXXZ 00401020 f CrashDemo.obj0001:00000070 _main 0040

12、1070 f CrashDemo.obj0004:00000000 _IMPORT_DESCRIPTOR_KERNEL32 00424000 kernel32:KERNEL32.dll0004:00000014 _NULL_IMPORT_DESCRIPTOR 00424014 kernel32:KERNEL32.dll0004:00000138 _imp_GetCommandLineA0 00424138 kernel32:KERNEL32.dll0004:0000013c _imp_GetVersion0 0042413c kernel32:KERNEL32.dll0004:00000140

13、 _imp_ExitProcess4 00424140 kernel32:KERNEL32.dll0004:00000144 _imp_DebugBreak0 00424144 kernel32:KERNEL32.dll0004:00000148 _imp_GetStdHandle4 00424148 kernel32:KERNEL32.dll0004:0000014c _imp_WriteFile20 0042414c kernel32:KERNEL32.dll0004:00000150 _imp_InterlockedDecrement4 00424150 kernel32:KERNEL3

14、2.dll0004:00000154 _imp_OutputDebugStringA4 00424154 kernel32:KERNEL32.dll0004:00000158 _imp_GetProcAddress8 00424158 kernel32:KERNEL32.dll0004:0000015c _imp_LoadLibraryA4 0042415c kernel32:KERNEL32.dll0004:00000160 _imp_InterlockedIncrement4 00424160 kernel32:KERNEL32.dll0004:00000164 _imp_GetModul

15、eFileNameA12 00424164 kernel32:KERNEL32.dll0004:00000168 _imp_TerminateProcess8 00424168 kernel32:KERNEL32.dll0004:0000016c _imp_GetCurrentProcess0 0042416c kernel32:KERNEL32.dll0004:00000170 _imp_UnhandledExceptionFilter4 00424170 kernel32:KERNEL32.dll0004:00000174 _imp_FreeEnvironmentStringsA4 00424174 kernel32:KERNEL32.dll0004:00000178 _imp_FreeEnvironmentStringsW4 00424178 kernel32:KERNEL32.dll0004:0000017c _imp_WideCharToMultiByte32 0042417

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号