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