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


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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM