DUMP文件

DUMP 文件


什么是 DUMP 文件

Dump 文件,也叫转储文件,是进程的内存镜像通过转换存储而成的 .dmp 格式的文件。DUMP 文件根据存储时的不同选项,会生成不同大小的文件,其中记录的信息也有所不同。DUMP 文件必须用专用工具软件才能查看,比如使用 Visual StudioWinDbg 等对其进行调试。

WindowsDUMP 文件分两大类,内核模式 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 StudioWinDbg 以及微软提供的 ADplus 都可以创建
    • Windbg 中通过 .dump 命令来生成
      1. 打开 WinDbg 并将之 Attach 到程序进程
      2. 输入产生 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); 

参考资料

猜你喜欢

转载自blog.csdn.net/Iron_Ye/article/details/80044835