天天看點

MFC捕捉程式運作崩潰時的Dump資訊捕捉

程式運作過程中出現崩潰,而且無任何有價值的資訊,如下圖所示:

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

繼續閱讀