异常调试——运行时

来源:互联网 发布:淘宝怎么设置7天上下架 编辑:程序博客网 时间:2024/06/16 09:58

程序中一般的问题,可以在debug模式下,设置断点,输入日志等方式排除,

但运行时发生的异常,往往很令人头疼,下面介绍几种运行时排查异常的几种方法:

1.通过map文件确定产生异常的模块和函数

1.1   map文件是什么

map文件是记录PE文件中各个模块及符号的偏移地址和加载地址的文本文件。

1.2 从哪获取map文件

在vs中做如下设置:

property->Configuration Properties->Linker->Debugging 中的Generate Map File选择Yes(/MAP);

同时可以指定生成的map文件名,使用工程名即可,F7重新编译,会在工程目录下产生map文件,用文本工具打开即可查看内容.

1.3 如何使用

在windows中,程序出现异常时,会给出异常偏移地址。


在map文件中,找到第一个比 ‘异常偏移’的地址(Rva+Base),它的上一个地址,就是产生异常的函数和模块.


2.通过cod文件确定异常的发生在源码中具体语句(代码行)

2.1 cod文件是什么

cod文件 记录了源码及其生成的机器码(汇编)等信息

2.1 从哪获取cod文件

property->Configuration Properties->C/C++->output Files中Assembler OutPut中

选择Assembly,Maching Code and Source(/FAcs),生成机器,源代码。 

2.3 怎么使用cod文件

前面通过map文件可以确定异常所在的函数&模块,打开与所在模块对应的cod文件,

找到发生异常的函数

‘异常偏移’ - 函数地址 = 异常在函数中的偏移地址,cod文件中左侧的地址

汇编代码上面为c/c++源码

如下:

; 8    :  *p=1;//c/c++代码

0001e 8b 45 08  mov  eax, DWORD PTR _p$[ebp] //汇编代码
00021 c7 00 01 00 00 
00   mov  DWORD PTR [eax], 1

3.使用dmp文件做更详细的分析

dmp文件又叫转储文件,记录程序崩溃的一些信息,使用windbg可以进一步分析问题

3.1如何生成dmp文件

3.2使用调试工具

windbg -I 将windbg注册为JIT debugger

然后在WinDbg的命令行中键入 .dump /ma c:\file.dmp 就可以了

3.3 通过代码

使用下面的函数,设置自定义的“未处理的异常过滤”

SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

然后在自定义的“未处理的异常过滤”中使用MiniDumpWriteDump记录dmp

ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = lpExceptionInfo;
ExInfo.ClientPointers = false;

MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL );

注意备份pdb文件


参考:

http://blog.csdn.net/weikangc/article/details/47839651

http://blog.csdn.net/gwzz1228/article/details/9045853


使用windbg分析dmp文件

http://blog.sina.com.cn/s/blog_a459dcf501017j2v.html


0 0
原创粉丝点击