目录
一、什么是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
|