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