适用于Windows下Unicode工程崩溃Dump生成

Windows C++程序崩溃分析:自动生成Dump文件与Windbg实战指南 在Windows平台C++开发中,程序崩溃是常见且棘手的问题,尤其是线上环境难以复现的场景。内存转储(Dump)文件作为程序崩溃瞬间的完整快照,记录了进程内存、线程堆栈和寄存器等关键状态,是事后调试的核心依据。其原理在于捕获系统异常信号(如结构化异常SEH),通过MiniDumpWriteDump API生成快照,再结合调试符号(PDB)进行逆向分析。这项技术的工程价值在于将黑盒问题转化为可追溯的现场证据,极大缩短故障定位时间。典型应用场景包括服务端程序无预警崩溃、客户端软件访问违例(Access Viol 阅读详情

公司项目中有一个项目用到的是Unicode工程,在添加dump文件生成的时候原来的不能用了,因此鄙人在原来的基础上进行了一部分的修改,使其能够在Unicode工程下发挥作用

#ifndef __BRExceptionFilter_H__

#define __BRExceptionFilter_H__





// Includes
#include "imagehlp.h"



typedef BOOL (__stdcall *FNDUMPWRITEDUMP) (HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, const PMINIDUMP_EXCEPTION_INFORMATION pcExceptionParam, LPCVOID pcUserStreamParam, LPCVOID pcCallbackParam);
										  /*PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, 
										  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, 
										  PMINIDUMP_CALLBACK_INFORMATION CallbackParam);*/


// Declarations
extern long __stdcall BRExceptionFilterWindows(_EXCEPTION_POINTERS* pExceptionInfo);



extern long BRExceptionFilter(_EXCEPTION_POINTERS* pExceptionInfo);



// Predefineds
//#pragma comment(linker, "/subsystem:windows /entry:BRWinMainCRTStartup")


// Declarations
extern "C" int BRWinMainCRTStartup(void);



#endif//__BRExceptionFilter_H__
/////////////////////////////////////////////////////////////

下面是cpp部分

/////////////////////////////////////////////////////////////
//
// File:	BRExceptionFilter.cpp
// Author:	Blood's Rust
// Date:	2012.03.20
// Version:	1.0.0.0
//
/////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BRExceptionFilter.h"



// Declarations
#ifndef _UNICODE
extern "C" int WinMainCRTStartup(void);
#else
extern "C" int wWinMainCRTStartup(void);
#endif




void DisableSetUnhandledExceptionFilter()
{

	HINSTANCE hDll = LoadLibrary(_T("kernel32.dll"));
	if(hDll)
	{
		void *addr = (void*)GetProcAddress(hDll, "SetUnhandledExceptionFilter");
		if (addr)  
		{
			unsigned char code[16];
			int size = 0;
			code[size++] = 0x33;
			code[size++] = 0xC0;
			code[size++] = 0xC2;
			code[size++] = 0x04;
			code[size++] = 0x00;

			DWORD dwOldFlag, dwTempFlag;
			VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
			WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
			VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
		}
	}
}




long __stdcall BRExceptionFilterWindows(_EXCEPTION_POINTERS* pExceptionInfo)
{
	/*MessageBox(NULL, _T("The unhandled exception filter for windows."), _T("Exception"), MB_OK);*/
	return BRExceptionFilter(pExceptionInfo);
}




long BRExceptionFilter(_EXCEPTION_POINTERS* pExceptionInfo)
{
	HINSTANCE hDll = LoadLibrary(_T("Dbghelp.dll"));
	if(hDll)
	{
		FNDUMPWRITEDUMP pfnMiniDumpWriteDump = NULL;
		pfnMiniDumpWriteDump = (FNDUMPWRITEDUMP)GetProcAddress(hDll, "MiniDumpWriteDump");

		if(pfnMiniDumpWriteDump)
		{
			TCHAR szFile[MAX_PATH] = {0};
			::GetModuleFileName(NULL, szFile, MAX_PATH);
			TCHAR tmp[64] ={0};
			wsprintf(tmp, _T("_%s_%d.dmp"), __argv[1], GetTickCount());
			_tcscat(szFile, tmp);

			HANDLE hFile = ::CreateFile(szFile, FILE_ALL_ACCESS, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
			if(hFile)
			{
				MINIDUMP_EXCEPTION_INFORMATION mei; 
				ZeroMemory(&mei, sizeof(mei));
				mei.ExceptionPointers	= pExceptionInfo;
				mei.ThreadId			= GetCurrentThreadId();
				mei.ClientPointers		= TRUE;

				if(pfnMiniDumpWriteDump) pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mei, NULL, NULL);
			}

			::CloseHandle(hFile);
		}
	}

	ExitProcess(0);
	return EXCEPTION_CONTINUE_SEARCH;
}





extern long __stdcall BRExceptionFilterWindows(_EXCEPTION_POINTERS* pExceptionInfo);



// Definitions
int BRWinMainCRTStartup()
{
	SetUnhandledExceptionFilter(BRExceptionFilterWindows);
	//DisableSetUnhandledExceptionFilter();

/*
#ifndef _UNICODE
	return WinMainCRTStartup();
#else
	return wWinMainCRTStartup();
#endif*/
	return 0;
}



/////////////////////////////////////////////////////////////


Dump文件全解析:从生成到分析,精准定位程序崩溃与性能问题 在软件开发和系统运维中,程序崩溃、性能瓶颈和内存泄漏是常见的挑战。理解程序运行时的内部状态是解决这些问题的关键,而Dump文件(或核心转储)正是记录这一状态的“快照”。其原理在于捕获进程在特定时刻的完整内存映像、线程堆栈和寄存器值,为事后分析提供了不可替代的现场证据。这项技术的核心价值在于,它允许开发者在无法实时调试的生产环境或难以复现的间歇性故障中,进行深入的事后调查,从而将问题定位从猜测提升到实证。无论是分析由访问违规(Access Violation)或堆损坏(Heap Corruption)导致的突 阅读详情

相关推荐

WinDbg实战:从蓝屏Dump分析到内核驱动崩溃根因定位

在Windows系统开发与调试领域,事后调试(Postmortem Debugging)是解决复杂崩溃问题的核心技术。其原理在于分析程序异常终止后生成的内存转储文件(Dump),该文件完整记录了崩溃瞬间的进程状态、线程堆栈和内存数据,如同系统的“黑匣子”。这项技术的核心价值在于能够对已发生但难以复现的线上故障进行精准回溯,尤其适用于分析系统蓝屏(BSOD)、应用程序无响应及资源泄漏等棘手场景。通过配置系统生成完整内存转储或进程特定Dump,开发者可以获取关键的现场证据。利用WinDbg等专业调试器加载符号(

weixin_30911451的博客 465

c++程序崩溃生成dump文件确定错误位置方法

利用开源类生成dump文件,精确查找程序崩溃点

西北攻城狮的博客 4459

c++ dump文件生成类

c++程序开发过程中出现程序奔溃的情况时,会自动生成一个dump文件,只需要打开dump文件即可确定程序具体奔溃在哪行代码。

VC++ Runtime Error 异常捕获之不挂的程序

很多软件通过设置自己的异常捕获函数,捕获未处理的异常,生成报告或者日志(例如生成mini-dump文件),达到Release版本下追踪Bug的目的。但是,到了VS2005(即VC8),Microsoft对CRT(C运行时库)的一些与安全相关的代码做了些改动,典型的,例如增加了对缓冲溢出的检查。新CRT版本在出现错误时强制把异常抛给默认的调试器(如果没有配置的话,默认是Dr.Watson),而不再通

3640

C++ 生成Dump文件

利用C++生成Dump文件,以后程序崩溃了,可以找到哪个函数出的问题。非常好用,企业级的应用!

Camunda流程引擎 Modeler (二)

Camunda Modeler是Camunda官方提供的建模器: 独立安装的建模器([windows、linux、mac]

1314

window下使用SetUnhandledExceptionFilter捕获让程序的崩溃

window下使用SetUnhandledExceptionFilter捕获让程序的崩溃

yantuguiguziPGJ的博客 848

[Unity]-[UI]-[Image] 关于UI精灵图资源导入设置的详细解释

如果纹理存储了有特定含义的信息,并且您需要着色器中的确切值(例如,平滑度或金属度),请禁用此属性。此选项允许将纹理编码为特定格式(RGBM 或 dLDR,具体取决于平台)并通过后期处理步骤对纹理数据进行处理(推拉式扩张通道)。使用在3D模型的专业法线贴图。通用的纹理类型,一般在Material上的材质图片参数使用,比如漫反射、法线贴图这些。​​Compression​​:ASTC 6x6(移动端)或DXT5(PC)​​Compression​​:BC5(PC)或ASTC 6x6(移动端)

sky_smile_Allen的博客 2171

JavaSE-知识点总结

Java名词 变量、运算符、类、接口、枚举、参数、注解、异常、包装类、多线程、集合、IO流、网络编程、反射、Lambda、API 源文件:.java文件,存储Java源代码的文件 字节码文件:.class文件,由Java源代码编译后生成的.class文件,可以被JVM读取和执行的文件。 运行Java程序,其实就是执行.class字节码文件,由JVM把字节码数据再转为二进制的机器指令执行。...

Addisoni 406

科研党福音:如何用Zotero+Paper Agent打造你的AI论文速递系统(附详细配置教程)

本文为科研工作者提供了一套利用Zotero和开源工具Paper Agent构建自动化AI论文速递系统的详细教程。该系统能基于用户在Zotero中的文献库智能学习研究兴趣,每日自动从arXiv等平台筛选、下载并深度解读最相关的前沿论文,生成个性化日报,实现从被动接收到主动精准获取的知识工作流重塑。

kite3的博客 517

VS2022跨平台开发实战:SSH远程调试Linux程序全攻略

本文详细介绍了如何使用Visual Studio 2022进行跨平台开发,通过SSH协议远程调试部署在Linux服务器上的C/C++程序。文章提供了从环境搭建、连接配置、项目创建到编译调试的完整实战指南,帮助Windows开发者无缝衔接Linux环境,显著提升问题定位与开发效率。

weixin_28826521的博客 431

Windows上Qt程序生成pdb文件,并在exe崩溃时生成dmp文件,且由dmp查询崩溃原因

Qt在windows下dump文件bug溯源

joyopirate的博客 5155

获取上传至DMS服务器上文件的URL

如果需要失效时间延长会设置URL永久有效, 可以去修改函数SCMS_URL_GENERATE的参数DURATION 或EXPIRATION ,DURATION最大时间是999999,若需要永久有效,则需要设置EXPIRATION的时间,这时系统会忽略DURATION的参数,生成URL的时候 SCMS_URL_GENERATE会调用SCMS_URL_SIGN函数这是其中默认这是了URL的生效时间为两小时。

一只学习的渣渣 542

windows生成dump文件

windows生成dump文件,便于程序崩溃是快速定位。

音视频技术之路QQ_1695710968 4363

运放+MOS恒流源电路仿真分析

利用运放设计一个恒流源

HW-BASE的博客 4098

华为OD机试双机位C卷:采购订单 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 采购订单,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,并提供在线OJ模拟做题。华为OD机试真题【采购订单】

qq_45776114的博客 3534

Windows C++程序崩溃排查:PDB、Dump与Windbg实战指南

在软件工程实践中,程序崩溃是开发者必须面对的挑战,尤其是在C++这类系统级编程语言中。其核心排查原理在于通过运行时快照(Dump文件)结合调试符号(PDB文件),还原崩溃瞬间的完整现场状态。这项技术的核心价值在于,它能将模糊的线上故障精准定位到具体的代码行和内存状态,极大提升问题诊断效率与软件可靠性。在Windows平台的C++开发场景中,这构成了服务端后台与客户端软件稳定性保障的基石。本文聚焦于利用PDB符号文件、Dump转储文件和Windbg调试器这套标准工具链,深入剖析访问违规、堆损坏等典型问题的排查

CURSED! 449

杰理AC695N系列芯片红外遥控按键使用教程

本文介绍了杰理AC695N芯片红外按键功能的配置和使用方法。主要内容包括:硬件连接说明(红外接收头接线至GPIO口)、软件配置(使能红外功能并设置接收引脚)、按键映射表修改(原始键值到逻辑按键的转换)以及按键扫描参数调整(消抖、长按时间等)。重点展示了三级映射机制,指导如何根据实际遥控器键值修改映射关系,实现不同模式下(蓝牙/音乐/FM)的自定义按键功能。最后提供了调试方法,可通过串口打印查看遥控器原始键值。

qq_42014563的博客 1463

windows下使用dbghelp解决未知崩溃问题

windows下使用dbghelp解决未知崩溃问题

DefiniteGoal的博客 1018

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【C/C++基础进阶系列】实战记录 -- Dump 文件生成与分析

【C/C++基础进阶系列】实战记录 -- Dump 文件生成与分析 【1】Windows 端 Dump 文件的捕获与分析 【1.1】添加 Windows 端Dump 捕获的代码 代码下载,window COREdump文件生成 c++代码 #ifndef MINIDUMPER_H #define MINIDUMPER_H #include <windows.h> class CMiniDumper { public: // 构造函数 CMiniDumper(boo.

CopperSun 技术博客 4501

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VS2010 C++程序生成Dump文件例子

VS2010 C++程序生成Dump文件例子 去发现同类优质开源项目:https://gitcode.com/ 此仓库包含一个使用Visual Studio 2010编写的C++程序示例,用于生成Dump文件。本示例专用于非Unicode环境,旨在帮助开发者理解如何捕获和分析程序崩溃时产生的Dump文件,以便进行调试和故障排除。 使用说明 环境要求:确保您的开发环境为Visual Studio ...

gitblog_06723的博客 243

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

windows下生成core dump文件

下面是从pandion里面摘取的两个文件 MiniDumper.h #ifndef MINIDUMPER_H #define MINIDUMPER_H #include class CMiniDumper { public: CMiniDumper(bool bPromptUserForMiniDump); ~CMiniDumper(void); private:

鸟窝 7880

VS2010 C++程序生成Dump文件例子:助力开发者高效调试

VS2010 C++程序生成Dump文件例子:助力开发者高效调试 去发现同类优质开源项目:https://gitcode.com/ 在软件开发过程中,调试是至关重要的一环。今天,我们要为大家介绍一个开源项目——VS2010 C++程序生成Dump文件例子,它可以帮助开发者快速生成和分析Dump文件,从而高效定位并解决程序中的问题。 项目介绍 VS2010 C++程序生成Dump文件例子,是一个专门...

gitblog_06732的博客 271

C++ 记录Windows程序崩溃时的dumpfile

【原理】       windows程序当遇到异常,没有try-catch或者try-catch也无法捕获到的异常时,程序就会自动退出,如果这时候没有dump文件的话,我们是没有得到任何程序退出的信息。在windows程序异常退出之前,会预先调用一个在程序中注册的异常处理回调函数(默认是没有设置),只要我们在这个回调函数中调用MiniDumpWriteDump函数就可以产生我们想要的dump文件

郎涯技术 5829

使用Windbg调试Dump文件:从崩溃现场到问题根因的完整指南

在软件开发和系统运维中,程序崩溃和系统宕机是常见的棘手问题。当故障发生时,内存转储文件(Dump文件)记录了进程崩溃瞬间的完整内存状态、线程堆栈和加载模块信息,成为事后分析的关键证据。其核心原理在于捕获应用程序或系统在异常时刻的快照,为离线调试提供了可能。这项技术的价值在于能够复现难以捕捉的线上问题,尤其是在无法直接附加调试器的生产环境中。通过分析Dump文件,工程师可以诊断内存泄漏、访问违规、死锁和堆损坏等复杂缺陷。在应用场景上,它广泛服务于Windows平台的驱动开发、服务端应用程序维护和高并发系统的问

weixin_30514745的博客 473
上一篇: Windows下利判断远程桌面功能是否启用
下一篇: 'wchar_t *' to 'const char *'
RuningPigNO1
博客等级 码龄10年 22粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RuningPigNO1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值