目录

一、什么是Dump文件

二、Dump文件的类型

2.1 内核模式Dump

2.2 用户模式Dump

三、Dump文件的生成

3.1 通过调试工具生成

3.2 通过使用任务管理器生成

3.3 通过编程自动生成

四、各种抓取DUMP的工具

一、什么是Dump文件

对于程序崩溃,最快的解决方式是生成dump文件,通过生成dump文件使用调试工具进行调试,还原程序崩溃时的状态,能够起到快速定位排查问题的作用。dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开。

二、Dump文件的类型

2.1 内核模式Dump

Dump文件分为两大类,内核模式Dump和用户模式Dump。内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。

2.2 用户模式Dump

用户模式Dump进一步可以分为完整Full Dump和Mini dump。Full Dump包含了某个进程完整的地址空间数据,以及许多用于调试的信息,而Mini dump则有许多类型,根据需要可以包含不同的信息,有的可能只包含某个线程和部分模块的信息。

三、Dump文件的生成

Dump文件能够保存程序内部的内存、堆栈、句柄、线程等程序运行相关的信息,非常具有重要性。

3.1 通过调试工具生成

通过调试工具创建。调试工具如Visual Studio,Windbg以及微软提供的ADplus都可以创建DUMP,在Windbg中通过.dump命令来生成。

3.2 通过使用任务管理器生成

该方式可以生成.DMP文件,通过打开任务管理器,找到插件服务对应的进程,右击,选择创建转储文件:

.DMP文件的存放位置如下图所示:

3.3 通过编程自动生成

当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。 在编程过程中,可以预期的异常都通过结构化异常(try/catch)进行了处理。此时,如果发生了未预期的异常,这些异常处理代码无法处理,则转由Windows提供的默认异常处理器来进行处理,这个特殊的异常处理函数为UnhandledExceptionFilter。该函数会显示一个消息框,提示发生了未处理的异常,同时,让用户选择结束或调试该进程。也就是如下界面: 因此,为了更友好的处理未预期的异常(主要是创建内存转储),可以覆盖默认的异常处理操作。这是通过函数SetUnhandledExceptionFilter完成的,函数原型如下:

LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(

_In_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter

lpTopLevelExceptionFilter即异常处理函数指针,如果设置为NULL,则默认使用UnhandledExceptionFilter。因此我们可以对照lpTopLevelExceptionFilter自定义一个异常处理函数。我们需要创建内存转储。这通过函数MiniDumpWriteDump来实现。 下述代码是一个通过MiniDumpWriteDump函数来实现转储文件创建

LONG WINAPI MyUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo )

{

HANDLE hFile = CreateFile("mini.dmp", GENERIC_READ|GENERIC_WRITE,

FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if( hFile == INVALID_HANDLE_VALUE )

return EXCEPTION_EXECUTE_HANDLER;

MINIDUMP_EXCEPTION_INFORMATION mdei;

mdei.ThreadId = GetCurrentThreadId();

mdei.ExceptionPointers = ExceptionInfo;

mdei.ClientPointers = NULL;

MINIDUMP_CALLBACK_INFORMATION mci;

mci.CallbackRoutine = NULL;

mci.CallbackParam = 0;

MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, &mci);

CloseHandle(hFile);

AfxMessageBox("已成功创建崩溃转储!");

return EXCEPTION_EXECUTE_HANDLER;

}

四、各种抓取DUMP的工具

任务管理器

任务管理器是自带抓取转储文件的工具。按住 Ctrl + Shift + Esc 即可打开。打开任务管理器后,在需要转储的进程上右键 -> 创建转储文件(C),即可自动保存转储文件到 %tmp% 目录下。

process explorer

process explorer 比系统自带的任务管理器更强大,打开 process explorer,在需要转储的进程上,右键 -> Create Dump -> Create Full Dump... 就可以保存转储文件了。( Create Minidump... 抓取的信息少,但抓取的转储文件小,适合网络传输,根据自己的需要选择)

Visual Studio

visual studio 简称 vs,大家应该对 vs 应该非常熟悉了,我就不多介绍了。打开 vs,附加到需要转储的进程上,点击 Break All 按钮(或者按快捷键 Ctrl + Alt + Break)暂停目标进程。然后点击 Debug -> Save Dump As... 就可以保存转储文件了。如果不暂停目标进程,Save Dump As... 按钮是置灰的

windbg

windbg 是 windows系统上非常强大的调试器,windbg能分析转储文件,当然能保存转储文件了。打开 windbg,附加到需要转储的进程上,执行 .dump [Options] path/to/save/dump.dmp