简介

dmp文件(dump文件): 系统错误内存转储文件 ,可以把转储文件看成软件的某个时刻的一个快照。系统发生错误时转储的内存镜像,记录有发生系统错误的详细信息。

windows 10系统默认的dmp转储文件路径为:%SystemRoot%MEMORY.DMP,也就是系统盘 Windows 目录下的 MEMORY.DMP 文件。

生成dmp文件

代码方式

开启生成pdb文件。

引入头文件和库。

包含DbgHelp.h头文件,并链接DbgHelp.lib库。
使用最新版 dbghelp.dll (建议从Windows SDK获取),避免兼容性问题。

方式一:

#include<dbghelp.h>#pragmacomment(lib,"dbghelp.lib")

方式二:

设置未处理异常过滤器。

在应用程序初始化时,注册异常处理回调。

BOOL CMyApp::InitInstance(){// 设置未处理异常过滤器SetUnhandledExceptionFilter(GenerateDump);...}

生成Dump文件。

LONG WINAPI GenerateDump(EXCEPTION_POINTERS* pException){// 生成带时间戳的Dump文件名
    SYSTEMTIME st;GetLocalTime(&st);
    TCHAR szFileName[MAX_PATH];_stprintf_s(szFileName,_T("C:\\Dumps\\Crash_%04d%02d%02d%02d%02d%02d.dmp"), 
        st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);// 创建Dump文件
    HANDLE hFile =CreateFile(szFileName, GENERIC_WRITE,0,NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);if(hFile == INVALID_HANDLE_VALUE)return EXCEPTION_EXECUTE_HANDLER;// 写入Dump内容
    MINIDUMP_EXCEPTION_INFORMATION ExInfo ={0};
    ExInfo.ThreadId =GetCurrentThreadId();
    ExInfo.ExceptionPointers = pException;
    ExInfo.ClientPointers = FALSE;MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),
        hFile,
        static_cast<MINIDUMP_TYPE>(MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithThreadInfo),&ExInfo,NULL,NULL);CloseHandle(hFile);return EXCEPTION_EXECUTE_HANDLER;}
控制Dump内容:

MiniDumpWriteDump的第四个参数控制Dump内容:
MiniDumpNormal: 基础信息(调用栈、线程等)。
MiniDumpWithFullMemory: 包含完整进程内存。
MiniDumpWithHandleData: 包含句柄信息。
MiniDumpWithThreadInfo: 包含线程状态信息。

ClientPointers

ClientPointers = FALSE :用于当前进程自身的崩溃处理(最常见场景)。
ClientPointers = TRUE :用于跨进程调试或外部诊断工具(需额外处理内存访问)。如果从一个外部进程(如调试器)调用 MiniDumpWriteDump 生成 Dump,且异常信息来自目标进程。

发布

发布时保留 .pdb 文件,以便用WinDbg或Visual Studio分析Dump。

任务管理器

原则 :用32位任务管理器给32位进程(无论该进程是运行在32位还是64位系统上面)生成转储文件,用64位任务管理器给64位进程生成转储文件。在64位系统上,32位的任务管理器位于 C:\Windows\SysWOW64\taskmgr.exe

生成方法 :右键进程 --> 创建转储文件–>弹出对话框提示生成成功,以及dmp文件位置。

ps:路径可在注册表中配置(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps)

Windbg

解析dmp文件

可以使用 Debugging Tools BlueScreenView 打开dmp文件进行分析。

Windbg

下载 & 安装

打开软件

打开生成的dmp文件

windbg解析

查看数据: !analyze -v

查看所有线程: ~*kbn

Adplus

adplus工具位于windbg安装目录。不仅可以在程序崩溃时手动运行来生成dmp文件,也可以在崩溃之前就运行它,当程序崩溃时它会自动生成dmp文件;甚至可以在程序没有运行之前就先运行adplus,当程序崩溃时它会自动生成dmp文件。


书:Memory Dump Analysis Anthology Volume