前言
有時候程式長期執行以後會崩潰,這種錯誤往往有很隱蔽,不容易定位,如果程式在崩潰時能記錄下崩潰的地址,那就能減少我們很多定位問題的時間,昨天分享了在生成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檔案除錯方法請參照其他文章。