当前位置: 首页 > news >正文

Windows程序崩溃捕获dump文件

Windows上程序崩溃时需要分析崩溃原因,需要程序崩溃的dmp文件和对应版本的pdb,Dump文件的获取方式有两大类:

  1. 通过WER或外部工具来捕获生成。
  2. 通过在代码中预埋,崩溃时自动生成dump文件。

一、通过WER或外部工具获取dump文件

对于已经发布的程序,基本主要使用该方式,通过修改注册表让WER或借助工具来生成dump文件。

1、 使用 procdump.exe 来捕获崩溃

procdump.exe 可以在程序启动之前或程序启动之后来进行监视,并在程序崩溃的时候生成dmp文件,其作为一个命令行工具,主要参数用法如下:

  • -accepteula : 自动接受许可协议(第一次运行不弹窗)
  • -e : 捕获未处理的异常(崩溃)
  • -ma : 生成 Full Dump
  • -w : 等待进程启动(wait),常用于捕获一启动就崩溃的进程
  • 在最后可以指定程序崩溃生成dump文件的路径,如果不指定则会保存在procdump.exe所在目录下

测试崩溃程序名称为 Test.exe

1)、程序未启动之前启动监视

在cmd中切换到 procdump 所在路径,并执行如下命令。如果指定dump文件所在路径,需要确保路该径存在

# 这里Test.exe为所监视程序的名称
procdump64.exe -accepteula -e -ma -w Test.exe ".\CrashDumps"

2)、程序启动之后启动监视

有些程序不需要未启动之前就监视,此时可以去掉 -w 参数,简洁命令如下:


procdump64.exe -e -ma Test.exe

根据需要可以将其封装成一个脚本,同 procdump放在同一个目录下,直接执行脚本来简化操作。


2、使用注册表启用WER来生成dump文件

WER自动捕获指定程序崩溃生成的dump文件,并指定dump文件的生成路径,需要修改注册表来启用对应的设置,注册表如下,针对特定的测试程序,其中 DumpFolder 为生成dump文件的路径,要保证程序要写入的权限

Windows Registry Editor Version 5.00; 针对 64 位进程 (或 32 位系统上的 32 位进程)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\Test.exe]
"DumpFolder"="D:\\CrashDumps"
"DumpCount"=dword:00000010
"DumpType"=dword:00000002; 针对 64 位系统上的 32 位进程 (关键补充)
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\Windows Error Reporting\LocalDumps\Test.exe]
"DumpFolder"="D:\\CrashDumps"
"DumpCount"=dword:00000010
"DumpType"=dword:00000002

执行这个注册表文件之后,会看到注册表的 WER 项有对应的修改


二、代码中内置崩溃异常生成dump文件

在当前的源代码中直接预埋对应注册函数,当异常崩溃发生时,直接自动捕获这个异常,并在指定位置生成对应的dump文件,对应的代码如下:

#include <windows.h>
#include <dbghelp.h>
#include <iostream>
#include <shlobj.h> // 用于创建目录
#include <string>/** *************************************************************/
// 如果不存在会递归创建
void CreateFullDirectory(std::wstring path) {size_t pos = 0;do {pos = path.find_first_of(L"\\/", pos + 1);CreateDirectory(path.substr(0, pos).c_str(), NULL);} while (pos != std::wstring::npos);
}void CreateDumpFile(EXCEPTION_POINTERS* pException) {// 方案 A: 自动获取 %LOCALAPPDATA% 路径wchar_t path[MAX_PATH];ExpandEnvironmentStrings(L"%LOCALAPPDATA%\\TestCrash\\", path, MAX_PATH);// 方案 B: 指定路径// wcscpy_s(path, L"D:\\MyDebugDumps\\");// 1. 确保目标文件夹存在CreateFullDirectory(path);// 2. 构造带时间戳的文件名,避免覆盖SYSTEMTIME st;GetLocalTime(&st);wchar_t fileName[MAX_PATH];swprintf_s(fileName, L"%lsCrash_%04d%02d%02d_%02d%02d%02d.dmp",path, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);// 3. 创建文件HANDLE hFile = CreateFile(fileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE) {MINIDUMP_EXCEPTION_INFORMATION dumpInfo;dumpInfo.ThreadId = GetCurrentThreadId();dumpInfo.ExceptionPointers = pException;dumpInfo.ClientPointers = TRUE;BOOL bSuccess = MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),hFile,MiniDumpNormal,&dumpInfo,NULL,NULL);if (bSuccess) {std::wcout << L"Dump saved to: " << fileName << std::endl;}CloseHandle(hFile);}
}LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo) {CreateDumpFile(ExceptionInfo);return EXCEPTION_EXECUTE_HANDLER;
}/** *************************************************************/// 主函数或dll程序入口注册这个异常过滤器,异常崩溃产生的时候自动生成dump文件int main()
{SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);/** crash code **/
}

这种方式在一些复杂场景下可能不会如期生成对应的dump文件,如C++ 标准库的 abort() 有时会绕过这个过滤器,或者多线程下的栈破坏问题,此时需要使用成熟的捕获崩溃的开源库

http://www.gsyq.cn/news/127305.html

相关文章:

  • 网络编程-TCP通信
  • 错过Open-AutoGLM等于错过下一个物流技术风口(仅限内部分享的优化秘籍)
  • 学Simulink--电力系统与能源管理场景实例:电动汽车电池管理系统(BMS)的设计与优化
  • 【弹簧】解决弹簧-质量-阻尼系统的强制振动问题【含Matlab源码 14737期】
  • 新罗纹眉哪家好:最新权威排名深度解析 - 品牌测评家
  • 【故障诊断】稀疏贝叶斯学习方法复合轴承故障诊断【含Matlab源码 14741期】
  • Open-AutoGLM外卖自动化实战(从部署到上线的完整路径)
  • 揭秘Open-AutoGLM如何实现毫秒级快递轨迹更新:技术架构全解析
  • 2025深圳|广州|东莞|惠州|珠海|佛山|中山|江门|肇庆|湛江|清远商业摄影培训机构推荐榜:陈阅视觉连续三年排名靠前 - 速递信息
  • Open-AutoGLM物流信息同步全解析(业界首次公开架构细节)
  • 电商比价不再难,手把手教你用Open-AutoGLM实现全自动利润挖掘
  • 2030年中国AI人才缺口或超400万!麦肯锡报告解析与大模型学习指南!
  • 2026年AI大模型学习攻略:从新手到专家,算法工程师的修炼手册!一篇文章掌握大模型与多模态奥秘!
  • 还在手动点外卖?Open-AutoGLM让你每天省下30分钟,效率翻倍!
  • WPF利用Resx的多语言支持
  • 从数据采集到实时追踪,Open-AutoGLM全流程拆解,开发者必看
  • Open-AutoGLM离线部署第一步:如何从Hugging Face稳定高速下载模型(完整教程)
  • 10个高效降AI率工具,MBA学生必备神器
  • nbsp;成分党狂喜!2025最好染发剂品牌公布:盖白效果最佳,,闭眼入不踩雷,手残党也能轻松上手 - 资讯焦点
  • 【UDS诊断(CommunicationControl_0x28服务)测试用例CAPL代码全解析⑨】 - 教程
  • 【独家披露】大厂都在用的Open-AutoGLM虚拟机集群部署架构设计
  • COMSOL有限元电场模型与ANSYS流体温度相变模拟分析
  • 完整教程:【C++:C++11】详解C++11右值引用与移动语义:从性能瓶颈到零拷贝优化
  • 低配电脑运行Open-AutoGLM的黄金法则:3项配置+2个脚本=零延迟响应
  • 优惠卷业务超卖问题解决方案
  • 采用DrissionPage批量采集抖音视频
  • Caddy服务器入门自动HTTPS的现代Web服务器
  • 直接上干货。这次咱们聊聊怎么用Simulink搞个能打的单相逆变器双环控制模型。重点说几个实操细节,保准你照着做就能出波形
  • 交换机.路由器.防火墙-技术提升【7.8】
  • 我发现流加密处理慢后来才知道用crypto流式分块API