c++如何把程序运行时的内存dump出文件_MiniDumpWriteDump【进阶】

浅磊酱_2011

浅磊酱_2011

2026-04-05

283人浏览

原创

minidumpwritedump 失败主因是权限不足或句柄非法:需管理员权限+se_debug_name、正确openprocess获取目标句柄,且32/64位必须匹配;dump类型应选minidumpnormal等组合标志而非fullmemory;符号路径和服务器配置决定windbg能否解析dump。

c++如何把程序运行时的内存dump出文件_minidumpwritedump【进阶】

MiniDumpWriteDump 为什么经常失败?权限和句柄是关键

直接调用 MiniDumpWriteDump 失败(返回 FALSE,GetLastError() 常见为 5 或 6)——根本原因不是函数写错了,而是没拿到目标进程的合法句柄,或当前进程缺乏调试权限。Windows 默认禁止普通进程打开其他进程的 PROCESS_QUERY_INFORMATION | PROCESS_VM_READ 权限。

  • 对自身进程 dump:必须先用 OpenProcess 获取自己的句柄(不能直接传 GetCurrentProcess(),它返回伪句柄,MiniDumpWriteDump 不认)
  • 对其他进程 dump:需以管理员权限运行,并启用 SE_DEBUG_NAME 权限(调用 AdjustTokenPrivileges)
  • 32/64 位不匹配会导致 ERROR_PARTIAL_COPY (299):32 位程序无法 dump 64 位进程,反之亦然

MiniDumpWriteDump 的 minidump 类型怎么选?别全用 MiniDumpWithFullMemory

MiniDumpWithFullMemory 看起来“最全”,但实际几乎不用——它会把整个进程地址空间(包括共享 DLL 的只读页)都写入文件,体积巨大(几 GB),且多数调试器(如 WinDbg)并不需要它。真正实用的是组合标志:

  • MiniDumpNormal:基础信息(线程、模块、异常)、最小体积,适合崩溃现场快照
  • MiniDumpWithIndirectlyReferencedMemory:额外捕获栈/寄存器指向的内存页(比如局部对象、参数缓冲区),调试时更可靠
  • MiniDumpWithThreadInfo:记录线程创建时间、退出码、TEB 地址,排查死锁/挂起必备
  • 慎用 MiniDumpWithFullMemoryInfo:它导出的是 MEMORY_BASIC_INFORMATION 结构数组,不是内存内容本身,体积小但需配合符号才能解读

dump 文件打不开?检查 pdb 路径和符号服务器配置

生成的 .dmp 文件本身不包含源码或类型信息,WinDbg 加载后显示 “*** ERROR: Module load completed but symbols not loaded for xxx.dll” 是常态。关键不在 dump 文件,而在符号(.pdb)是否可达:

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 本地 pdb 必须与编译时完全一致(时间戳 + GUID 匹配),放在与 .exe 同目录或显式用 .sympath+ c:\path\to\pdb 添加
  • 系统 DLL 符号应配置微软符号服务器:.sympath SRV*c:\symbols*https://msdl.microsoft.com/download/symbols
  • 如果用了自定义模块加载(如 LoadLibraryA 动态加载),需在 dump 前调用 MiniDumpWriteDump 的 CallbackRoutine 参数,手动注入模块信息,否则 WinDbg 找不到该模块的基址

如何在程序崩溃时自动触发 dump?结构化异常处理(SEH)比 set_unexpected 更可靠

SetUnhandledExceptionFilter 是 Windows 下捕获崩溃的首选,但要注意它只捕获当前线程的未处理异常;C++ 异常(throw/catch)需额外处理。标准做法是双钩:

  • 用 SetUnhandledExceptionFilter 捕获访问违规、除零等 SEH 异常
  • 用 std::set_terminate 捕获未被捕获的 C++ 异常(注意:此时栈已开始展开,MiniDumpWriteDump 仍可安全调用)
  • 回调函数里避免分配内存、加载 DLL 或调用 C 运行时函数(如 fopen),全部用 Windows API(CreateFileW, WriteFile)完成写入
  • 示例关键片段:
    LONG WINAPI CrashHandler(EXCEPTION_POINTERS* pException) {
        HANDLE hFile = CreateFileW(L"crash.dmp", GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, pException, nullptr, nullptr);
        CloseHandle(hFile);
        return EXCEPTION_EXECUTE_HANDLER;
    }

结构体对齐、堆栈损坏时,pException 可能无效,所以生产环境建议加一层 __try/__except 保护 dump 写入逻辑本身。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

929

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

2640

5

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

4334

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

4471

25

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5187

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2288

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5187

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2288

6

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

3838

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习