0
点赞
收藏
分享

微信扫一扫

自动生成dump 进程快照

云岭逸人 2022-03-11 阅读 83

一、自动生成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的分析

1、无pdb
C++、Qt工程设置产生pdb文件
2、有pdb无源码
3、有pdb有源码

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

举报

相关推荐

0 条评论