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); 

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章