讲师中心 微信公众号
AI工具推荐 视频效率加速

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

浅磊酱_2011

浅磊酱_2011

发布时间:2026-04-05 22:41:04

|

283人浏览过

|

来源于php中文网

原创

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)需额外处理。标准做法是双钩:

立即学习“C++免费学习笔记(深入)”;

  • 用 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 写入逻辑本身。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

929

2023.10.18

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

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

2640

2023.10.25

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

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

4334

2025.06.09

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

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

4471

2025.07.04

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

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

5187

2023.07.18

堆和栈区别
堆和栈区别

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

2288

2023.08.10

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

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

5187

2023.07.18

堆和栈区别
堆和栈区别

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

2288

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn