VC++使用dump定位release程序崩溃问题
包含生成dump的头文件,头文件见文章末尾
全局声明宏DECLARE_DUMPGEN
初始化函数中使用宏INIT_DUMPGEN(随便定义一个名字)
写一个必然崩溃的按钮响应代码
运行程序调用响应函数使程序崩溃,生成dump文件
此时定位问题除了dump文件,还必须要exe程序,和该exe同时生成的pdb文件。
双击dump文件,使用vs打开,点击 使用仅限本机进行调试
【如果代码的路径位置和程序发布时没有任何变化,即可直接定位到崩溃位置】
【如果代码的路径变了,则需要在弹出的窗口中选择代码文件夹】
生成dump的头文件:
#pragma once
#include < Dbghelp.h>
#pragma comment(lib, "Dbghelp.lib")
class DumpGen
{
public:
static DumpGen* GetInstance()
{
if (NULL == m_pDumpGen)
{
m_pDumpGen = new DumpGen();
}
return m_pDumpGen;
}
static DumpGen *m_pDumpGen;
void Init(TCHAR *dumpName)
{
_tcscpy_s(m_dumpName,MAX_PATH,dumpName);
}
TCHAR m_dumpName[MAX_PATH];
public:
static void CreateDumpFile(TCHAR* lpstrDumpfileName,EXCEPTION_POINTERS *pException)
{
HANDLE hFile = CreateFile(lpstrDumpfileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),hFile,MiniDumpNormal,&dumpInfo,NULL,NULL);
CloseHandle(hFile);
}
static LONG ApplicationCrash(EXCEPTION_POINTERS *pException)
{
TCHAR dumpFile[1024] = {0};
SYSTEMTIME tm;
GetLocalTime(&tm);
_stprintf_s(dumpFile,1024,_T("%s_%d%d%d%d%d%d.dmp"), DumpGen::GetInstance()->m_dumpName,tm.wYear,tm.wMonth,tm.wDay,tm.wHour,tm.wMinute,tm.wHour);
CreateDumpFile(dumpFile,pException);
FatalAppExit(-1,dumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
private:
DumpGen()
{
memset(m_dumpName,0,MAX_PATH);
}
};
#define DECLARE_DUMPGEN DumpGen* DumpGen::m_pDumpGen = NULL;
#define INIT_DUMPGEN(DumpName) \
DumpGen* pDumpGen = DumpGen::GetInstance();\
pDumpGen->Init(DumpName);\
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)pDumpGen->ApplicationCrash);