DUMP
文件
什么是 DUMP
文件
Dump
文件,也叫转储文件,是进程的内存镜像通过转换存储而成的 .dmp
格式的文件。DUMP
文件根据存储时的不同选项,会生成不同大小的文件,其中记录的信息也有所不同。DUMP
文件必须用专用工具软件才能查看,比如使用 Visual Studio
、WinDbg
等对其进行调试。
Windows
下 DUMP
文件分两大类,内核模式 Kernel-Mode DUMP
和用户模式 User-Mode DUMP
。
Kernel-Mode Dump
:操作系统创建的崩溃转储,最经典的就是系统蓝屏User-Mode Dump
Full Dump
:某个进程完整的地址空间数据,以及许多用于调试的信息Mini Dump
:某个线程和部分模块的信息
如何创建 DUMP 文件
- 通过修改注册表来自动生成
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
Value Name = DumpType
Data Type = REG_DWORD
Value Data = (0.Create custom dump 2.Mini dump 3.Full dump)
- 程序崩溃时会自动输出
DUMP
到:%localappdata%\CrashDumps
- 通过任务管理器创建
- 打开任务管理器,找到目标进程,右键-“创建转储文件”,即可保存
DUMP
- 这种方式创建的
DUMP
文件为FullDUMP
,缺乏灵活性
- 打开任务管理器,找到目标进程,右键-“创建转储文件”,即可保存
- 通过调试工具创建
- 调试工具如
Visual Studio
、WinDbg
以及微软提供的ADplus
都可以创建 - 在
Windbg
中通过.dump
命令来生成
- 打开
WinDbg
并将之Attach
到程序进程 - 输入产生
DUMP
文件的命令
.dump /m C:\dumps\myapp.dmp
(系统信息、加载的模块信息、 进程信息和线程信息).dump /ma C:\dumps\myapp.dmp
(完整的内存内容、句柄、未加载的模块).dump /mFhutwd C:\dumps\myapp.dmp
(带有数据段、非共享的读\写内存页)
- 打开
- 调试工具如
- 通过编程自动创建
#include <DbgHelp.h>
#pragma comment(lib, "Dbghelp.lib")
// 此函数需要包含上面头文件和引入相应的库
LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* _pExcp)
{
HANDLE hFile = CreateFile(
"d:\\myapp.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);