自动生成dump 进程快照

一、自动生成dump的作用

1、dump文件为进程快照,可再程序崩溃的状态,方便事后查找程序的崩溃原因。
2、自动生成的作用在于可以捕捉崩溃,而不用人为监视。若手动生成,不但需要监视,很多崩溃难以复现。
3、与debug分析崩溃问题就更加具有优越性了,debug条件就苛刻,用户无法debug,需要程序员操作;很多情况下公司无复现环境,源代码又不方便带出;
4、与运用程序日志相比各有优劣,日志针对流程、功能等异常分析更优,而崩溃问题自动生成dump方案更优。

二、自动生成dump功能模块的实现

#ifndef __CREATE_DUMP_FILE_H__
#define __CREATE_DUMP_FILE_H__

#include <windows.h>
#include <dbghelp.h>
#include <string>

#pragma comment(lib, "dbghelp.lib")

/**
* @brief 发布程序崩溃时dump产生类
*
* 在main函数开始时调用该单例类declarDumpFile函数
* 声明希望产生的dmp文件的前缀,即可在程序崩溃时自动产生.dmp文件
*/
class CCreateDump
{
public:
	/**
	* @brief 单例对象获取函数
	* @param 空
	* @return 返回CCreateDump单例对象指针
	*/
	static CCreateDump* instance()
	{
		static CCreateDump sInstance;

		return &sInstance;
	}

	/**
	* @brief 声明Dump文件名,即崩溃时.dmp文件的前缀
	* @param dumpFileName, .dmp文件前缀
	* @return 空
	*/
	void declarDumpFile(const char* dumpFileName)
	{
		SYSTEMTIME sysTime;
		::GetLocalTime(&sysTime);

		char szPath[MAX_PATH] = { 0 };
		sprintf_s(
			szPath,
			MAX_PATH,
			"%s[%04d%02d%02d%02d%02d%02d].dmp",
			dumpFileName,
			sysTime.wYear,
			sysTime.wMonth,
			sysTime.wDay,
			sysTime.wHour,
			sysTime.wMinute,
			sysTime.wSecond);

		m_dumpFileName = szPath;
		::SetUnhandledExceptionFilter(unhandleExceptionFilter);
	}

private:
	CCreateDump() {}
	CCreateDump(const CCreateDump&);
	CCreateDump& operator=(const CCreateDump&);

	static long WINAPI unhandleExceptionFilter(_EXCEPTION_POINTERS* exceptionInfo)
	{
		HANDLE file = ::CreateFileA(
			m_dumpFileName.c_str(),
			GENERIC_WRITE,
			FILE_SHARE_WRITE,
			NULL,
			CREATE_ALWAYS,
			FILE_ATTRIBUTE_NORMAL,
			NULL);

		if (INVALID_HANDLE_VALUE == file)
		{
			return EXCEPTION_CONTINUE_SEARCH;
		}

		MINIDUMP_EXCEPTION_INFORMATION miniDumpInfo;
		miniDumpInfo.ThreadId = ::GetCurrentThreadId();
		miniDumpInfo.ExceptionPointers = exceptionInfo;
		miniDumpInfo.ClientPointers = FALSE;

		BOOL ret = ::MiniDumpWriteDump(
			GetCurrentProcess(),
			GetCurrentProcessId(),
			file,
			MiniDumpNormal,
			&miniDumpInfo,
			NULL,
			NULL);

		::CloseHandle(file);

		if (!ret)
		{	
			return EXCEPTION_CONTINUE_SEARCH;
		}

		return EXCEPTION_CONTINUE_SEARCH;
	}

private:
    static std::string				m_dumpFileName;
};

std::string CCreateDump::m_dumpFileName;

#endif // __CREATE_DUMP_FILE_H__

三、设置自动生成Dump

//main函数开始调用
CCreateDump::instance()->declarDumpFile("FileName");

应用程序绝大多数崩溃都会自动生成dump文件在.exe同级目录。

四、Dump文件的分析

要求:发布的程序所对应的源代码和PDB文件都是匹配(发布程序的时候,保留源代码和PDB文件)。

1、设置产生pdb文件
1)C++工程
visual studio配置C++项目生成.pdb文件(符号文件)https://blog.csdn.net/a2824256/article/details/122219898

2)Qt工程
.pro文件中添加,msvc编译器,MINGW编译器貌似不行。

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
export(QMAKE_CXXFLAGS_RELEASE)
export(QMAKE_LFLAGS_RELEASE)

2、Dump文件分析
将Dump文件和匹配的pdb文件放在同文件夹,vs打开Dump文件,此时就可以查看堆栈信息;将会提示加载相应的源码(版本匹配)文件,此时可查看堆栈及其变量的值信息。
参考:C++程序崩溃用VS2019生成dump

如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大胡子的艾娃

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

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

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

打赏作者

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

抵扣说明:

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

余额充值