码迷,mamicode.com
首页 > 数据库 > 详细

Qt 使用DbgHelp和SetUnhandledExceptionFilter来获取Crash log/dump文件

时间:2020-06-05 15:04:20      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:long   sid   format   erp   time()   添加   libs   val   message   

第一步:在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的保持和警告窗口提示。

Qt 使用DbgHelp和SetUnhandledExceptionFilter来获取Crash log/dump文件

标签:long   sid   format   erp   time()   添加   libs   val   message   

原文地址:https://www.cnblogs.com/ybqjymy/p/13049295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!