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

说明

客户现场的软件偶发崩溃是程序开发者,比较头疼的事情。如何更快速的定位到问题点和解决掉,是开发应该具备的基本能力。
Windows提供了一系列的API,可以记录软件崩溃前的堆栈信息。下面就实现一个生成Dump文件的程序实例。

主要代码

回调AppExceptionCallback

#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

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

编译问题

在这里插入图片描述
问题解决办法,记录在另一篇文章:

相关推荐

  1. MiniDumpWriteDump函数生成dmp文件

    2024-04-26 19:42:04       45 阅读
  2. Qt使用ffmpeg获取视频文件封面图

    2024-04-26 19:42:04       30 阅读
  3. Qt 使用qm文件

    2024-04-26 19:42:04       12 阅读
  4. qt绘制生成PDF文件

    2024-04-26 19:42:04       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-26 19:42:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-26 19:42:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-26 19:42:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-26 19:42:04       20 阅读

热门阅读

  1. Android Binder——APP中的Binder通信(十八)

    2024-04-26 19:42:04       10 阅读
  2. C++默认参数

    2024-04-26 19:42:04       8 阅读
  3. Bazel离线编译SPU

    2024-04-26 19:42:04       16 阅读
  4. git rebase 使用详解

    2024-04-26 19:42:04       14 阅读
  5. 一些RabbitMQ面试题

    2024-04-26 19:42:04       14 阅读
  6. RTT学习

    RTT学习

    2024-04-26 19:42:04      13 阅读
  7. Docker备忘清单(三)

    2024-04-26 19:42:04       10 阅读
  8. vue3前端请求后端接口动态渲染菜单

    2024-04-26 19:42:04       11 阅读
  9. leetcode144--二叉树的前序遍历

    2024-04-26 19:42:04       12 阅读
  10. 使用Dokcer中的Mysql导入sql文件

    2024-04-26 19:42:04       15 阅读
  11. 银行卡四要素API接口的验证流程

    2024-04-26 19:42:04       14 阅读