当前位置: 首页 > 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.jsqmd.com/news/115366/

相关文章:

  • 为什么顶尖程序员都在研究Open-AutoGLM自动下单?真相曝光!
  • Open-AutoGLM比价自动化实战,20年技术老兵首次公开核心算法逻辑
  • 小模型逆袭!一文读懂模型蒸馏:为何小参数也能媲美大模型?
  • 2025 年优质服装批发市场指南:直击采批痛点,打造高效进货新生态 - 速递信息
  • 学Simulink--通信系统场景实例:软件定义无线电(SDR)平台上的信号处理流程
  • 为什么顶级OTA都在用Open-AutoGLM?,揭秘其背后的价格优势算法
  • 网络编程-TCP通信
  • 新罗纹纹眉选哪个:专业精选指南必读攻略 - 品牌测评家
  • Comtos Linux 研究的科学与哲学
  • garfish微前端教程,零基础入门到精通,收藏这篇就够了
  • 学Simulink--音频DSP(数字信号处理)场景实例: 音频滤波器设计与实现
  • 错过Open-AutoGLM等于错过下一个物流技术风口(仅限内部分享的优化秘籍)
  • 为什么90%的快递平台都在研究Open-AutoGLM?真相令人震惊
  • 一文了解开源大语言模型文件结构,以 Hugging Face DeepSeek-V3.1 模型仓库为例 - 详解
  • 12.20
  • 学Simulink--电力系统与能源管理场景实例:电动汽车电池管理系统(BMS)的设计与优化
  • 【独家披露】Open-AutoGLM内部架构图流出:看懂它,你就掌握了下一代智能预订核心
  • AI幻觉问题的终极解决方案:揭秘可靠RAG技术的三重把关机制,让AI从’胡说八道王’升级为’靠谱答题员!
  • 新罗纹眉哪家好:最新权威排名深度解析 - 品牌测评家
  • 【弹簧】解决弹簧-质量-阻尼系统的强制振动问题【含Matlab源码 14737期】
  • 前端大文件上传,零基础入门到精通,收藏这篇就够了
  • 2025年CNC数控机床谁家强?设计服务口碑排行榜揭晓,动力刀塔数控车/4轴数控机床/液冷接头数控机床CNC数控机床品牌哪家好 - 品牌推荐师
  • 【故障诊断】稀疏贝叶斯学习方法复合轴承故障诊断【含Matlab源码 14741期】
  • 揭秘Open-AutoGLM物流数据同步难题:3步实现毫秒级响应
  • SwiftUI 如何精准识别用户点击的单词?一套可落地的实现方案
  • AI Agent智能体是什么?和LLM关系是什么?
  • 前端部署更新后,如何优雅地通知用户刷新页面?收藏这篇就够了
  • Open-AutoGLM外卖自动化实战(从部署到上线的完整路径)
  • 揭秘Open-AutoGLM如何实现毫秒级快递轨迹更新:技术架构全解析
  • Open-AutoGLM物流信息同步全解析(业界首次公开架构细节)