第一步:在pro中链接Lib
LIBS += -lDbgHelp
或
#pragma comment(lib , "DbgHelp.lib")
第二步:在main源文件中添加
#include <windows.h>
第三步:在main源文件中创建回调函数:
1 LONG CreateCrashHandler(EXCEPTION_POINTERS *pException){ 2 //创建 Dump 文件
3 QDateTime CurDTime = QDateTime::currentDateTime(); 4 QString current_date = CurDTime.toString("yyyy_MM_dd_hh_mm_ss"); 5 //dmp文件的命名
6 QString dumpText = "Dump_"+current_date+".dmp"; 7 EXCEPTION_RECORD *record = pException->ExceptionRecord; 8 QString errCode(QString::number(record->ExceptionCode, 16)); 9 QString errAddr(QString::number((uint)record->ExceptionAddress, 16)); 10 QString errFlag(QString::number(record->ExceptionFlags, 16)); 11 QString errPara(QString::number(record->NumberParameters, 16)); 12 HANDLE DumpHandle = CreateFile((LPCWSTR)dumpText.utf16(), 13 GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 14 if(DumpHandle != INVALID_HANDLE_VALUE) { 15 MINIDUMP_EXCEPTION_INFORMATION dumpInfo; 16 dumpInfo.ExceptionPointers = pException; 17 dumpInfo.ThreadId = GetCurrentThreadId(); 18 dumpInfo.ClientPointers = TRUE; 19 //将dump信息写入dmp文件
20 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),DumpHandle, MiniDumpNormal, &dumpInfo, NULL, NULL); 21 CloseHandle(DumpHandle); 22 } 23 //创建消息提示
24 QMessageBox::warning(NULL,"Dump",QString("ErrorCode%1 ErrorAddr:%2 ErrorFlag:%3 ErrorPara:%4").arg(errCode).arg(errAddr).arg(errFlag).arg(errPara), 25 QMessageBox::Ok); 26 return EXCEPTION_EXECUTE_HANDLER; 27 }
第四步:在main函数中添加注册dump回调函数
1 int main(int argc, char *argv[]) 2 { 3 QApplication a(argc, argv); 4 //获取系统编码
5 QTextCodec *codec = QTextCodec::codecForLocale(); 6 QTextCodec::setCodecForLocale(QTextCodec::codecForLocale()); 7 //注冊异常捕获函数
8 SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CreateCrashHandler); 9 /***代码实现***/
10 }
这样就可以实现crashlog的保持和警告窗口提示。