MFC捕捉程序运行崩溃时的Dump信息捕捉

时间:2024-03-26 16:25:32

程序运行过程中出现崩溃,而且无任何有价值的信息,如下图所示:

MFC捕捉程序运行崩溃时的Dump信息捕捉

为了便于我们进行程序定位,我们可以使用Dump文件进行协助我们进行问题分析。

1.导入相应头文件和库文件

#include <DbgHelp.h>  
#pragma comment(lib,"DbgHelp.lib")

2.编写生成Dump的函数

//创建dump文件
void CreateDumpFile(CString lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)  
{  
    HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  
    // Dump信息
    MINIDUMP_EXCEPTION_INFORMATION dumpInfo;  
    dumpInfo.ExceptionPointers = pException;  
    dumpInfo.ThreadId = GetCurrentThreadId();  
    dumpInfo.ClientPointers = TRUE;  
    // 写入dump文件
    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);  
    CloseHandle(hDumpFile);  
}  

// 处理Unhandled Excepiton 的回调函数
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)  
{   
    SYSTEMTIME time;
    GetLocalTime(&time);
    CString strDmpName;
 strDmpName.Format("%02d%02d_%02d%02d%02d.dmp",time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);
    CreateDumpFile(strDmpName,pException);  
    return EXCEPTION_EXECUTE_HANDLER;  
}

 3.函数调用,在程序的初始化函数中如OnInitDialog()

//调用捕捉函数

SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);

4.同时,需要修改项目的属性,链接器->调试,将“生成调试信息”设置为“是”。
5.将生成时的调试文件(*.pdb)也一同拷贝至程序运行目录下。