当前位置: 首页 > article >正文

Qt 软件调试(二)使用dump捕获崩溃信息

Qt应用程序异常崩溃该怎么办,生成dump文件再回溯分析,可以快速且准确的帮助我们定位到崩溃的点。那么,本章我们分享下如何在Qt中生成dump文件。

一、使用minudump捕获崩溃信息

#include <QCoreApplication>
#include <QDir>
#include <QDateTime>
#include <QDebug>
#ifdef Q_OS_WIN
#   include <windows.h>
#   include <dbghelp.h>
#   pragma comment( lib, "Dbghelp.lib" )
#endif
#define DumpFileDir qApp->applicationDirPath() + "/dump/"

static LONG WINAPI AppExceptionCallback(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
    QString savePath = DumpFileDir;
    savePath.append(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));
    savePath.append(".dmp");
    qDebug() << savePath;

    QString msg;
    HANDLE hDumpFile = CreateFileW(savePath.toStdWString().c_str(),
                                   GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,
                                   0, CREATE_ALWAYS, 0, 0);
    if(INVALID_HANDLE_VALUE == hDumpFile)
    {
        return EXCEPTION_EXECUTE_HANDLER;
    }

    MINIDUMP_EXCEPTION_INFORMATION ExpParam;
    ExpParam.ThreadId = GetCurrentThreadId();
    ExpParam.ExceptionPointers = ExceptionInfo;
    ExpParam.ClientPointers = TRUE;

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

    QString strTitle ("Application Error");
    QString strContent ("I'm Sorry,Application is Crash!");
    qDebug() << strContent << "," << QStringLiteral("dump文件路径为 ") << savePath;

    return EXCEPTION_EXECUTE_HANDLER;
}

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

#ifdef Q_OS_WIN  /// 创建dump
    QDir dir(DumpFileDir);
    if(!dir.exists()){
        if (!dir.mkpath(DumpFileDir))
            qDebug() << QStringLiteral("创建dump文件目录失败");
    }
    SetUnhandledExceptionFilter(AppExceptionCallback);
#endif

    return app.exec();
}

在pro中我们需要添加如下信息:

# 在release模式下生成debug信息:.pdb
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

二、准备好windbg工具

在这里插入图片描述
具体怎么操作呢,我们会在接下的章节中逐步深入!~


http://www.kler.cn/a/145156.html

相关文章:

  • 使用 cmake
  • 富文本 tinyMCE Vue2 组件使用简易教程
  • 「 机器人 」扑翼飞行器控制策略浅谈
  • 【外文原版书阅读】《机器学习前置知识》2.用看电影推荐的例子带你深入了解向量点积在机器学习的作用
  • 《大语言模型》综述学习笔记
  • Docker容器数据恢复
  • Linux | 重定向 | 文件概念 | 查看文件 | 查看时间 | 查找文件 | zip
  • 基于Python的面向对象分类实例Ⅱ
  • LeetCode Hot100 33.搜索旋转排序数组
  • 【精选必看】MyBatis映射文件及动态SQL,一级,二级缓存介绍
  • 【广州华锐互动】Web3D云展编辑器能为展览行业带来哪些便利?
  • [Python人工智能] 四十.命名实体识别 (1)基于BiLSTM-CRF的威胁情报实体识别万字详解
  • Swagger在php和java项目中的应用
  • CentOS rpm安装Nginx和配置
  • FFmpeg常用命令讲解及实战二
  • 【Spring篇】spring核心——AOP面向切面编程
  • 鸿蒙原生应用/元服务开发-AGC分发如何上架HarmonyOS应用
  • openssl升级
  • JVM虚拟机:JVM调优第一步,了解JVM常用命令行参数
  • JsonRPC协议详解(协议介绍、请求示例、响应示例)
  • kafka学习笔记(一)--脑裂
  • 【statsmodels】快速实现回归预测
  • 【代码随想录】算法训练计划31
  • Docker ps命令
  • 浏览器没收到返回,后端也没报错,php的json_encode问题bug
  • 【开源】基于Vue+SpringBoot的农家乐订餐系统