Qt 程序异常崩溃,记录Dump文件并重启程序

Posted DreamLife.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 程序异常崩溃,记录Dump文件并重启程序相关的知识,希望对你有一定的参考价值。

Qt 程序异常崩溃,记录Dump文件并重启程序

​ 最近还是在公司写BUG,不过也没有啥测试人员,就是我单打独斗,程序是烧在机器里面的。在家里出现BUG还好,在外面出现BUG,那就有点丢人了,不怕出问题,不能影响用户使用,所以,为了防止程序抽风,异常崩溃,在崩溃后要重新启动才可以。一下内容仅仅是调试编译没有问题,效果没有测试。我也不知道怎么能整出异常结束来。


文章目录

关键字: 异常dumpdbghelplibdll

参考链接

​ 代码来之这里:Qt(windows下)捕获异常信息并自动重启

搬运代码

​ 按照参考,我们将博主的代码搬运到自己的代码中,在搬运过程中出现了点问题, QString errCode(QString::number(record->ExceptionCode,16)),errAdr(QString::number((uint)record->ExceptionAddress,16)),errMod;博主的这个强转uint在我这里编译不过,我的环境是Qt 5.15.2 MinGW 64,所以我摸索的改了一下QString errCode(QString::number(record->ExceptionCode,16)),errAdr(QString::number(reinterpret_cast<uintptr_t>(record->ExceptionAddress),16)),errMod;这是我的代码。目前编译没有问题。

​ 另外博主在Connect连接信号的时候,第三个参数没有写,虽然不影响使用,编译器会有提示,我还是给他加上了NULL没有啥实际作用,仅仅是不让编译器提示。

​ 最终的代码搬运如下:别忘了加头文件

#include <windows.h>
#include <Dbghelp.h>
QMessageBox *msgbPtr;
void initMessageBox()

    msgbPtr = new QMessageBox();
    msgbPtr->setWindowFlag(Qt::WindowStaysOnTopHint);
    msgbPtr->setIcon(QMessageBox::Critical);
    msgbPtr->setWindowTitle("软件崩溃");
    msgbPtr->setText("未知原因崩溃,程序将在5s后重启");

    QPushButton *rebootButton;
    QPushButton *rejectButton ;

    rebootButton = msgbPtr->addButton("重启", QMessageBox::AcceptRole);
    rejectButton = msgbPtr->addButton("退出", QMessageBox::RejectRole);

    QObject::connect(msgbPtr, &QMessageBox::buttonClicked,NULL, [=](QAbstractButton *button)
        if(button == (QAbstractButton*)rebootButton)
        
            qDebug() << "start application:" << QProcess::startDetached(qApp->applicationFilePath(), QStringList());//重启
            //            qApp->quit();
        
        else if(button == (QAbstractButton*)rejectButton)
        
            msgbPtr->close();
        


    );

long __stdcall   errCallback(_EXCEPTION_POINTERS*  pException)

    QDir dir;
    dir.mkdir("../dumps");
    dir.cd("../dumps");
    /*
          ***保存数据代码***
        */
    QString fileName = dir.path() + "/" +
            QDateTime::currentDateTime().toString("yyyyMMdd_HHmmss.zzz") + ".dmp";

    LPCWSTR pFileName = (LPCWSTR)fileName.unicode();

    //创建 Dump 文件
    HANDLE hDumpFile = CreateFile(pFileName,GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    qDebug() << "create dumpFile:" << hDumpFile << INVALID_HANDLE_VALUE;
    if(hDumpFile != INVALID_HANDLE_VALUE)
    
        //Dump信息
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pException;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        //写入Dump文件内容
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
    
    EXCEPTION_RECORD* record = pException->ExceptionRecord;
    QString errCode(QString::number(record->ExceptionCode,16)),errAdr(QString::number(reinterpret_cast<uintptr_t>(record->ExceptionAddress),16)),errMod;


    qDebug() << "main thread:" << qApp->thread() << QThread::currentThread();

    int lastTime = 5;
    QTimer *timer = new QTimer();
    timer->setInterval(1000);
    QObject::connect(timer, &QTimer::timeout, NULL,[&lastTime, &errCode]()
        lastTime--;
        if(lastTime < 0)
        
            qDebug() << "start application:" << QProcess::startDetached(qApp->applicationFilePath(), QStringList());//重启
            msgbPtr->close();
            return;
        

        QString info = QString("未知原因崩溃,程序将在%1s后重启\\r\\n%2").arg(lastTime).arg(errCode);
        msgbPtr->setText(info);
    );
    timer->start();
    msgbPtr->exec();
    return EXCEPTION_EXECUTE_HANDLER;

解决库问题

​ 光搬运代码其实是运行不起来的,提示如下,所以我们需要解决库。

​ 在pro项目文件中加入一下代码

LIBS += -L./T_Lib/ -ldbghelp,引入库。

解决运行问题

​ 有了lib可,其实还是不可以运行的,还得有dll库,把dll库放到程序更目录即可。这里我把库也整理好了,来这里拿,免费dbghelp lib库和dll库到这里基本就完事了,至于有没有效果,咱就不负责了。


以上是关于Qt 程序异常崩溃,记录Dump文件并重启程序的主要内容,如果未能解决你的问题,请参考以下文章

android 中处理崩溃异常并重启程序

Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

编写的windows程序,崩溃时产生crash dump文件的办法

Windows 程序 dump 崩溃调试

qt qdebug正常releasd异常

Linux下的core dump