Qt 程序异常崩溃,记录Dump文件并重启程序
Posted DreamLife.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 程序异常崩溃,记录Dump文件并重启程序相关的知识,希望对你有一定的参考价值。
Qt 程序异常崩溃,记录Dump文件并重启程序
最近还是在公司写BUG,不过也没有啥测试人员,就是我单打独斗,程序是烧在机器里面的。在家里出现BUG还好,在外面出现BUG,那就有点丢人了,不怕出问题,不能影响用户使用,所以,为了防止程序抽风,异常崩溃,在崩溃后要重新启动才可以。一下内容仅仅是调试编译没有问题,效果没有测试。我也不知道怎么能整出异常结束来。
文章目录
关键字:
异常
、dump
、dbghelp
、lib
、dll
参考链接
代码来之这里: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文件并重启程序的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)