Qt [获取Dump] 使用WindowsAPI实现生成MiniDump文件

说明

客户现场的软件偶发崩溃是程序开发者,比较头疼的事情。如何更快速的定位到问题点和解决掉,是开发应该具备的基本能力。

Windows提供了一系列的API,可以记录软件崩溃前的堆栈信息。下面就实现一个生成Dump文件的程序实例。

主要代码

回调AppExceptionCallback

cpp 复制代码
#ifdef Q_OS_WIN
#include <windows.h>
#include <dbgHelp.h>
#endif

#ifdef Q_OS_WIN
#pragma comment(lib, "dbghelp.lib")
LONG WINAPI AppExceptionCallback(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
    QString logFile = QApplication::applicationDirPath() + "/Log";
    if (!QDir(logFile).exists())
    {
        QDir().mkdir(logFile);
    }

    QString dumpName = QString("%1/%2.dmp").arg(logFile).arg(QDateTime::currentDateTime().toString("yyyy_MM_dd hh_mm_ss"));
    HANDLE hDumpFile = CreateFileW(dumpName.toStdWString().c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ExceptionPointers = ExceptionInfo;
        dumpInfo.ClientPointers = TRUE;

        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, ExceptionInfo ? &dumpInfo : nullptr, nullptr, nullptr);
        CloseHandle(hDumpFile);
    }

    QMessageBox::critical(nullptr, QString("Application Error"), QString("Application is Crash!"), QMessageBox::Ok);
    return EXCEPTION_EXECUTE_HANDLER;
}
#endif

main函数调用SetUnhandledExceptionFilter

cpp 复制代码
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    #ifdef Q_OS_WIN
    SetUnhandledExceptionFilter(AppExceptionCallback);
    #endif
    Widget w;
    w.show();
    return a.exec();
}

编译问题

问题解决办法,记录在另一篇文章:

相关推荐
“AI国潮设计-小江”7 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人7 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
sunshine22 girl8 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
菜鸟~noob2339 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
惊讶的猫10 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
cmpxr_10 小时前
【MicroPython】如何刷新ESP8266的固件
开发语言·micropython
搭贝10 小时前
上厕所的时间搭好一套系统:AI自动生成实测
开发语言·人工智能·低代码·ai·php·搭贝
智感子11 小时前
智能称重·数据上云:从仪表读数到可追溯的计量凭证
开发语言·php
\光辉岁月/11 小时前
7.javase-面向对象
java·开发语言
weixin_5310946911 小时前
heap_4内存管理
java·开发语言·算法