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);


发布了42 篇原创文章 · 获赞 7 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/jiyanglin/article/details/79659705