1. 程式人生 > 其它 >qt pro 設定dump檔案機制

qt pro 設定dump檔案機制

dump檔案可以很好的捕獲到程式crash的異常點。

pro檔案設定如下:

#dump 除錯
#DEFINES += WITH_DUMP
contains(DEFINES, WITH_DUMP){
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
LIBS += -lDbghelp
message("WITH_DUMP")
}else{
message("WITHOUT_DUMP")
}

main.cpp檔案新增生成程式碼如下:

#ifdef WITH_DUMP
#include <dbghelp.h>
#include <exception>
#endif
#ifdef WITH_DUMP

long ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
    QString strdir = QString("%1/dump").arg(qApp->applicationDirPath());
    XCore::dirCreate(strdir);
    QDateTime dtcur = QDateTime::currentDateTime();
    QString strcur 
= dtcur.toString("yyyyMMddhhmmss"); QString strfile = QString("%1/%2.dmp").arg(strdir).arg(strcur); EXCEPTION_RECORD *record = pException->ExceptionRecord; XCore::writeFile(QString::number(record->ExceptionCode, 16), "dump"); XCore::writeFile(QString::number(record->ExceptionFlags, 16
), "dump"); //建立 Dump 檔案 HANDLE hDumpFile = CreateFile((LPCWSTR)strfile.utf16(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hDumpFile != INVALID_HANDLE_VALUE) { //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); }else{ XCore::writeFile("create dump file failed", "dump"); } return EXCEPTION_EXECUTE_HANDLER; } #endif
#ifdef WITH_DUMP

    //註冊異常捕獲函式
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);

#endif