自定义VS程序异常处理及调试Dump文件(一)
2017-07-17 12:31
288 查看
1. Dump文件
1. Dump文件介绍
Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀。dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件。dump文件根据存储时的选项不同,会生成不同大小的文件,其中记录信息也自然有所不同。2. Dump文件分类
程序分两种,内核模式程序和用户模式程序,也即Ring0程序和Ring3程序。Dump文件是伴随着程序而生成的,所以Dump文件也同样分两种。1. Kernel-Mode Dump Files(内核模式Dump文件),主要是驱动程序,此文不涉及。
2. User-Mode Dump Files(用户模式Dump文件),主要是应用程序及服务程序,此文所讲。
用户模式Dump文件又分Full User-Mode Dumps和Minidumps。前者生成的是完整的内存快照,所以文件比较大。后者依然生成选项,生成包含不同信息的Dump文件。此文以Minidumps文件来分析调试。
3. Dump文件生成方式
通过WinDbg工具的命令用WinDbg来Attach崩溃提示窗口的process,然后输入
.dump /m C:\myapp.dmp命令,即可生成默认的miniDump文件(只包含系统信息、加载的模块(DLL)信息、 进程信息和线程信息)。
通过Windows任务管理器,选择指定进程,右键生成转储文件(此时的转储文件即为Full User-Mode Dumps,包含所有信息,所以文件比较大)。
通过代码在程序崩溃时生成Dump文件。
#include <DbgHelp.h> #pragma comment(lib, "Dbghelp.lib") // 此函数需要包含上面头文件和引入相应的库 LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* _pExcp) { HANDLE hFile = CreateFile( "d:\\Format.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { return EXCEPTION_CONTINUE_EXECUTION; } MINIDUMP_EXCEPTION_INFORMATION einfo = {0}; einfo.ThreadId = ::GetCurrentThreadId(); einfo.ExceptionPointers = _pExcp; einfo.ClientPointers = FALSE; MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, // 指定生成默认的Minidump文件 &einfo, NULL, NULL); CloseHandle(hFile); return EXCEPTION_EXECUTE_HANDLER; } // 下面函数放在当前模块的入口函数处,指定ExceptionFilter替换原生的异常处理 // 即当原本要弹出崩溃提示窗口前,需要经过此函数处理,可以处理完立即退出,也可以继续 SetUnhandledExceptionFilter(ExceptionFilter);
2. 分析Dump文件
1. 使用Visual Studio
选择与生成Dump文件相同版本的VS。启动VS并打开Dump文件。
必须保证生成Dump文件的程序的PDB文件和源代码相一致。
VS2005打开Dump文件时,直接按F5调试,代码会停在出错的地方,通过Call Stack窗口查看。
VS2010打开Dump文件时,
需要通过
Set symbol paths设置符号文件路径,也即PDB文件路径。然后点击
Debug with Native Only,代码即会暂时在出错的地方,通过Call Stack窗口查看相关信息。
2. 使用WinDbg
选择相应版本的WinDbg,x86还是AMD64(也即X64,因为64桌面架构系统是AMD最新发布)。File->Open Crush Dump,打开指定的Dump文件。
File->Symbol File Path,添加
srv*D:\Symbols*http://msdl.microsoft.com/download/symbols
File->Symbol File Path,添加程序的PDB文件夹路径。这样可以调试系统DLL,也可以调试自有程序。
然后在WinDbg命令行中输入
!analyze -v,等待WinDbg分析完毕。
通过上图,即可以看到代码崩溃的行数。
3. 自定义崩溃窗口
通常Windows会提供一个默认的崩溃提示窗口,或者是程序直接闪退。重写
ExceptionFilter函数,即可以重新定义崩溃窗口,用以提示用户发送相关信息给软件提供商。
示例代码
示例代码是Win32类型的DLL,导出接口
SetCustomUnhandledExceptionFilter在Solution的启动Project的最开始调用一次即可。
下载
相关文章推荐
- 自定义VS程序异常处理及调试Dump文件(一)
- DELPHI基础教程 第十二章 异常处理与程序调试(一)
- DELPHI基础教程 第十二章 异常处理与程序调试(二)
- java异常处理和自定义异常利用try和catch让程序继续下去
- DELPHI基础教程 第十二章 异常处理与程序调试(三)
- 第十五章 程序调试与异常处理
- OllyICE 调试的程序无法处理异常 解决方法
- 异常处理与程序调试
- [转]DELPHI程序的调试与异常处理
- win8.1 OllyICE 调试的程序无法处理异常 解决方法
- 1900页Python系列PPT分享八:异常处理结构与程序调试、测试(70页)
- 12.Delphi异常处理与程序调试
- Python(六)--异常的处理与程序调试
- python 第十七周 异常处理与程序调试
- C#学习 - vs调试(采用异常处理来实现两个整数的和)
- VS调试异常代码 异常:HRESULT: 0x80070057 (E_INVALIDARG) 的处理
- java异常处理和自定义异常利用try和catch让程序继续下去(回来自己再写个例子试运行下)
- 程序中的异常处理(自定义UncaughtExceptionHandler)
- Python(异常处理与程序调试)
- python异常处理与程序调试