简介

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

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

生成dmp文件

代码方式

开启生成pdb文件。

在这里插入图片描述
在这里插入图片描述

引入头文件和库。

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

方式一:

#include <dbghelp.h>
#pragma comment(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: 包含线程状态信息。

MINIDUMP_TYPE 枚举

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 ToolsBlueScreenView打开dmp文件进行分析。

Windbg

下载 & 安装

https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools

打开软件

在这里插入图片描述

打开生成的dmp文件

在这里插入图片描述

windbg解析

查看数据:!analyze -v

在这里插入图片描述

查看所有线程:~*kbn

Adplus

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

windbg使用超详细教程
书:Memory Dump Analysis Anthology Volume
如何生成转储(dmp)文件–工具篇

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐