zoukankan      html  css  js  c++  java
  • Qt下使用DbgHelp和SetUnhandledExceptionFilter来获取Crash log/dump文件

    第一步:在pro中链接Lib

    LIBS += -lDbgHelp

    第二步:在main源文件中添加

    #include <windows.h>
    #include <Dbghelp.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的保持和警告窗口提示。

  • 相关阅读:
    【DP】解析 SOSdp(子集和 dp)
    【图论】AcWing 342. 道路与航线 题目解答 (拓扑序+dijkstra)
    【DP】斜率优化初步
    Educational Codeforces Round 95 (Rated for Div. 2) 题解(待更)
    2020-2021 ACM-ICPC, Asia Seoul Regional Contest 部分题目解答
    Codeforces Round #704 (Div. 2) 题解(待更)
    Samara Farewell Contest 2020 (XXI Open Cup, GP of Samara) 部分题目解答
    AtCoder Regular Contest 113 题解(待补)
    docker中php-fpm无法更改时区问题
    pod时区更改
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14693777.html
Copyright © 2011-2022 走看看