QT应用编程: window下QT程序异常捕获并生成DMP文件、PDB文件

2022-01-07 14:33:47 浏览数 (1)

一、环境介绍

操作系统: win10 64位

QT版本: QT5.12.6

编译器: MinGW 32 、 MSVC2017 (x86)

二、捕获异常、弹窗提示用户

2.1 main.cpp代码

代码语言:javascript复制
#include "widget.h"
#include <QApplication>
#include <winsock2.h>
#include <dbghelp.h>
#include <windows.h>
#include <winnt.h>
#include <QMessageBox>
#include <QString>
#include <QTime>

/*
工程: debug_test
日期: 2021-03-19
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 程序异常捕获接口
*/
LONG ExceptionCapture(EXCEPTION_POINTERS *pException)
{
    //完成一些数据保存工作
    //.....

    //弹出错误对话框并退出程序
    QMessageBox::critical(nullptr,"错误提示",QString("当前程序遇到异常."),QMessageBox::Ok,QMessageBox::Ok);
    return EXCEPTION_EXECUTE_HANDLER;
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //注冊异常捕获函数
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ExceptionCapture);
    Widget w;
    w.show();
    return a.exec();
}

2.2 widget.cpp代码. 模拟一个异常

代码语言:javascript复制
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    int *p=nullptr;
    *p=66666666;
}

2.3 运行效果

三、捕获异常、生成DMP文件

3.1 main.cpp代码

代码语言:javascript复制
#include "widget.h"
#include <QApplication>
#include <winsock2.h>
#include <dbghelp.h>
#include <windows.h>
#include <winnt.h>
#include <QMessageBox>
#include <QString>
#include <QTime>

/*
工程: debug_test
日期: 2021-03-19
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 程序异常捕获接口
*/
LONG ExceptionCapture(EXCEPTION_POINTERS *pException)
{
    //当前时间串
    const int TIMESTRLEN = 32;
    WCHAR timeStr[TIMESTRLEN];
    SYSTEMTIME time;
    GetLocalTime(&time);
    swprintf_s(timeStr, TIMESTRLEN, L"Mddddd", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
    WCHAR strname[MAX_PATH];
    swprintf_s(strname, MAX_PATH, L"application_%s.dmp", timeStr);

    //创建 Dump 文件
    HANDLE hDumpFile = CreateFile(strname, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
    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, nullptr, nullptr);
    }

    //完成一些数据保存工作
    //.....

    //弹出错误对话框并退出程序
    QMessageBox::critical(nullptr,"错误提示",QString("当前程序遇到异常.n  异常文件:%1").arg(QString::fromWCharArray(strname)),QMessageBox::Ok,QMessageBox::Ok);
    return EXCEPTION_EXECUTE_HANDLER;
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //注冊异常捕获函数
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ExceptionCapture);
    Widget w;
    w.show();
    return a.exec();
}

3.2 在pro工程文件里加代码

代码语言:javascript复制
LIBS  = -lDbgHelp

3.3 运行效果

四、Release版本生成PDB文件

程序出现问题之后,为了方便复现问题、需要有pdb文件。qtcreate默认是不生成pdb文件。需要在pro工程文件里加入以下代码。

代码语言:javascript复制
QMAKE_LFLAGS_RELEASE  = /MAP
QMAKE_CFLAGS_RELEASE  = /Zi
QMAKE_LFLAGS_RELEASE  = /debug /opt:ref

QMAKE_CXXFLAGS_RELEASE  = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE  = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

LIBS  = -lDbgHelp

编译需要选择:MSVC

0 人点赞