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)也一同拷貝至程序運行目錄下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章