MFC程序崩溃时生成dmp文件

devtools/2024/11/16 17:20:38/
#include “HiExceptionHandle.h”
#include <string>
#pragma once
class HiExceptionHandle
{
public:HiExceptionHandle(void);~HiExceptionHandle(void);
public:void RunCrashHandler();void SetWERDumpLocation(const std::wstring dumpFolderPath);
protected:static LONG WINAPI UnhandledExceptionFilterEx(/*struct _*/PEXCEPTION_POINTERS pException);static inline void CreateMiniDump(PEXCEPTION_POINTERS pep, LPCTSTR strFileName);
};
#include “HiExceptionHandle.cpp”
#include "pch.h"
#include "HiExceptionHandle.h"
#include <windows.h> 
#include <imagehlp.h> 
#include <stdlib.h>
#include "AtCodeMasterDlg.h"
#pragma comment(lib, "dbghelp.lib") 
HiExceptionHandle::HiExceptionHandle(void)
{
}
HiExceptionHandle::~HiExceptionHandle(void)
{
} 
void HiExceptionHandle::RunCrashHandler()
{ SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); 
}LONG WINAPI HiExceptionHandle::UnhandledExceptionFilterEx(/*struct _*/PEXCEPTION_POINTERS pException)
{TCHAR szMbsFile[MAX_PATH] = { 0 }; ::GetModuleFileName(NULL, szMbsFile, MAX_PATH);  TCHAR* pFind = _tcsrchr(szMbsFile, '\\'); if(pFind) { *(pFind+1) = 0;_tcscat(szMbsFile, L"AtCodeMaster.dmp");CreateMiniDump(pException, szMbsFile);}FatalAppExit(0,  _T("非常抱歉,软件发生故障,请记录并反馈相关信息!"));// SendMessage(AfxGetMainWnd()->m_hWnd, WM_CLOSE, 0, 0); AtCodeMasterDlg dlg;      dlg.CloseAllApp(); dlg.LogSavesXls("Error.txt", "程序崩了并生成.dmp文件!");EndDialog(AfxGetMainWnd()->m_hWnd, 0);    abort();return EXCEPTION_CONTINUE_SEARCH; 
}
void HiExceptionHandle::CreateMiniDump(PEXCEPTION_POINTERS pep, LPCTSTR strFileName)
{HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE/*GENERIC_WRITE*/, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if ((hFile != NULL) /*&& (hFile != INVALID_HANDLE_VALUE)*/){MINIDUMP_EXCEPTION_INFORMATION exceptionParam;exceptionParam.ThreadId = GetCurrentThreadId();exceptionParam.ExceptionPointers = pep;exceptionParam.ClientPointers = FALSE;MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &exceptionParam, NULL, NULL);CloseHandle(hFile);}
}
在InitInstance()中调用
BOOL AtCodeMaster::InitInstance()
{// 如果一个运行在 Windows XP 上的应用程序清单指定要// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, // 则需要 InitCommonControlsEx()。  否则,将无法创建窗口。 INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 将它设置为包括所有要在应用程序中使用的// 公共控件类。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);excep.RunCrashHandler();//使用.dmp定位bug(优雅崩溃) 
}

MFC程序崩溃时生成dmp文件失败

我MFC项目的dmp日志总是生成在C:\Users\Administrator\AppData\Local\CrashDumps目录,我想保存在其它的位置。 SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); 始终未被执行

第一种方法:修改注册表

在这里插入图片描述

第二种方法:在C++应用程序中动态修改注册表(需要管理员权限)
void HiExceptionHandle::SetWERDumpLocation(const std::wstring dumpFolderPath) 
{HKEY hKey = NULL;LONG result = RegCreateKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\Windows Error Reporting\\LocalDumps",0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,NULL);if (result == ERROR_SUCCESS) {result = RegSetValueEx(hKey,L"DumpFolder",0,REG_SZ,(const BYTE*)dumpFolderPath.c_str(),(dumpFolderPath.size() + 1) * sizeof(wchar_t));if (result != ERROR_SUCCESS) {std::wcerr << L"Failed to set DumpFolder value in registry. Error code: " << result << std::endl;}RegCloseKey(hKey);}else {std::wcerr << L"Failed to create LocalDumps key in registry. Error code: " << result << std::endl;}// Optionally, you can also set the DumpType value here
}

调用:

void HiExceptionHandle::RunCrashHandler()
{ SetWERDumpLocation( L"D:\\Log\\dump");SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); 
}

运行效果:
在这里插入图片描述


http://www.ppmy.cn/devtools/134485.html

相关文章

一文说清libc、glibc、glib的发展和关系

一 引言 在大家的技术生涯中&#xff0c;一定会遇到glib、glibc、libc这些个名词。 尤其像我这种对英文名脸盲的人&#xff0c;看着它们就头大&#xff0c;因为单从名字上看&#xff0c;也太像了&#xff0c;所以经常容易混淆。 即使翻翻网上的资料&#xff0c;看完还是有点懵…

企业生产环境-麒麟V10(ARM架构)操作系统部署kafka高可用集群

前言&#xff1a;Apache Kafka是一个分布式流处理平台&#xff0c;由LinkedIn开发并捐赠给Apache软件基金会。它主要用于构建实时数据流管道和流应用。Kafka具有高吞吐量、可扩展性和容错性的特点&#xff0c;适用于处理大量数据。 以下是Kafka的一些核心概念和特性&#xff1…

基于HTTP编写ping操作

基于HTTP编写ping操作 前言 在上一集我们就完成了创建MockServer的任务&#xff0c;那么我们就可以正式开始进行网络的通讯&#xff0c;那么我们今天就来基于HTTP来做一个客户端ping服务端的请求&#xff0c;服务端返回pong的响应。 需求分析 基于HTTP&#xff0c;实现ping…

Java爬虫:获取商品历史价格信息 API 数据

穿越时空的购物侦探 引言 如果你以为Java只能用来制作乏味的桌面应用&#xff0c;那你一定没见识过它的另一面——一个能够穿越时空的购物侦探&#xff01;今天&#xff0c;我们就来聊聊如何用Java编写一个爬虫&#xff0c;这个爬虫不仅能获取商品的当前价格&#xff0c;还能…

校园服务平台小程序ssm+论文源码调试讲解

第2章 关键技术简介 2.1 微信小程序 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种全新的连接用户与服务的方式&#xff0c;可以快速访问、快速传播&#xff0c;并具有良好的使用体验[12]。 小程序的主要开发语言是JavaScript&#xff…

本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…

maven的optional选项说明以及具体应用

写在前面 本文看下maven的optional选项的作用和用法。 1&#xff1a;什么作用 考虑这样的场景&#xff0c;A依赖B&#xff0c;B依赖C&#xff0c;正常的按照依赖的传递性&#xff0c;A也会间接的依赖C&#xff0c;但是在一些特定的场景中项目A只希望依赖B&#xff0c;而不依…

【洛谷】T539820 202411A Giants

题目背景 Were wide awake now our eyes are wide openWere running this world we keeping it turningWere living like Giants.Yeah Giants.Were bigger than Giants.We Giants. 节选自《Giants》。 题目描述 在《迪迪卫》中&#xff0c;一次魔法的能量和五个参数有关&…