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