首頁>技術>

前言

有時候程式長期執行以後會崩潰,這種錯誤往往有很隱蔽,不容易定位,如果程式在崩潰時能記錄下崩潰的地址,那就能減少我們很多定位問題的時間,昨天分享了在生成MAP檔案的方法,今天再來分享一下Windows系統中讓QT程式在崩潰時生成dump檔案的方法。

什麼是Dump檔案?有什麼作用?

Dump檔案是程序的記憶體映象。可以把程式的執行狀態透過偵錯程式儲存到Dump檔案中。Dump檔案必須用專用工具軟體開啟,比如WinDbg。

實現方法

1、將下面的程式碼複製貼上到main.cpp中。

#if defined(Q_OS_WIN32)#include <windows.h>#include <DbgHelp.h>#pragma comment(lib, "Dbghelp.lib")long __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp){    //建立 Dump 檔案    HANDLE hDumpFile = ::CreateFile(        L"Demo.DMP", //輸出的dump檔案的名稱        GENERIC_WRITE,        0,        NULL,        CREATE_ALWAYS,        FILE_ATTRIBUTE_NORMAL,        NULL);    if (hDumpFile != INVALID_HANDLE_VALUE)    {        //Dump資訊        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;        dumpInfo.ExceptionPointers = pexcp;        dumpInfo.ThreadId = GetCurrentThreadId();        dumpInfo.ClientPointers = TRUE;        //寫入Dump檔案內容        ::MiniDumpWriteDump(            GetCurrentProcess(),            GetCurrentProcessId(),            hDumpFile,            MiniDumpNormal,            &dumpInfo,            NULL,            NULL);    }    return 0;}#endif

2、新增下面程式碼,可執行程式在main函式第一行新增,dll在初始化函式或者最先執行的函式中新增。

#if defined(Q_OS_WIN32)::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);#endif

3、dump檔案需要和pdb檔案一起配合使用,所以release版本的程式還要在在pro中新增下面程式碼以生成除錯資訊,debug版本可跳過此步。

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFOQMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

4、程式崩潰時會在執行程式的同級目錄下生成DMP檔案,將DMP檔案和pdb檔案複製到程式碼工程的release目錄下,雙擊DMP檔案,VS會自動開啟,然後點選右側的使用僅限本機進行除錯,就會定位到程式碼出錯的地方。具體Dump檔案除錯方法請參照其他文章。

19
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 要做商業開源還是免費開源?開源專案盈利探究系列之2