Qt程式异常崩溃处理技巧(Win)

2023-11-08

     文章转载来自     http://www.cnblogs.com/lcchuguo/p/5177715.html     作者 lcchuguo


这篇文章谈的是 Qt4 程式在视窗系统下的异常崩溃处理技巧。所以须要在头文件里包括“#include <Windows.h>”。

首先,程式难免会有异常崩溃的时候。重要的是在崩溃时能及时把重要的数据保存好,将损失减少。

SetUnhandledExceptionFilter函数是Win32API的异常捕获函数,在程式异常结束前。会调用该函数注冊的回调函数,这样就能在进程终止前运行指定的代码,达到比如保存数据的功能。

LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException){//程式异常捕获
    /*
      ***保存数据代码***
    */
    //这里弹出一个错误对话框并退出程序
    EXCEPTION_RECORD* record = pException->ExceptionRecord;
    QString errCode(QString::number(record->ExceptionCode,16)),errAdr(QString::number((uint)record->ExceptionAddress,16)),errMod;
    QMessageBox::critical(NULL,"程式崩溃","<FONT size=4><div><b>对于发生的错误,表示诚挚的歉意</b><br/></div>"+
        QString("<div>错误代码:%1</div><div>错误地址:%2</div></FONT>").arg(errCode).arg(errAdr),
        QMessageBox::Ok);
    return EXCEPTION_EXECUTE_HANDLER;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);//注冊异常捕获函数
    MainWindow w;
    w.showMaximized();
    return a.exec();
}

保存数据仅是拯救措施,更重要的是找到错误的根源。若能在崩溃的同一时候,程式自己主动记录下崩溃时的执行信息,将有助于修正工作。微软提供了“DbgHelp”错误调试技术。调用相关功能就可以保存程式崩溃时的信息,然后借助WinDbg软件就能分析出当时的执行状况。

调用“DbgHelp”的MiniDumpWriteDump函数保存以“.dmp”为后缀的Dump文件,该文件能被WinDbg读取并分析。

你须要加入头文件“#include <DbgHelp.h>”,在Pro文件里加入“LIBS += -lDbgHelp”。目的是链接DbgHelp库。

LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException){//程式异常捕获
    /*
      ***保存数据代码***
    */
    //创建 Dump 文件
    HANDLE hDumpFile = CreateFile(QTime::currentTime().toString("HH时mm分ss秒zzz.dmp").utf16(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    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((uint)record->ExceptionAddress,16)),errMod;
    QMessageBox::critical(NULL,"程式崩溃","<FONT size=4><div><b>对于发生的错误,表示诚挚的歉意</b><br/></div>"+
        QString("<div>错误代码:%1</div><div>错误地址:%2</div></FONT>").arg(errCode).arg(errAdr),
        QMessageBox::Ok);
    return EXCEPTION_EXECUTE_HANDLER;
}

当被错误困扰得焦头烂额的时候。若是老天能直接告诉错误在哪一行代码该有多好呀。其实WinDbg就能做到。

在项目的proproject文件里增加:QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG

这句话的目的是Release版也将生成“.pdb”后缀的调试信息文件。在使用WinDbg导入Dump前。指定好源代码与pdb文件的位置。就可以在错误报告内看到罪魁祸首是哪一行代码。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt程式异常崩溃处理技巧(Win) 的相关文章

  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • 如何将 QByteArray 转换为十六进制字符串?

    我有打击QByteArray QByteArray ba ba 0 0x01 ba 1 0x10 ba 2 0x00 ba 3 0x07 我真的不知道如何将此 QByteArray 转换为结果字符串 其中包含 01100007 我将使用 Q
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 我应该使用 QCoreApplication::processEvents() 还是 QApplication::processEvents()?

    我有一个从两者调用的方法QThreads和主线程 这个方法有时可能需要很长时间才能在循环中进行计算 所以我把QCoreApplication processEvents 这可以防止 GUI 冻结 在某个时刻我已经改变了QCoreApplic
  • 如何使 Python、QT 和 Webkit 在无头服务器上工作?

    我有 Debian Linux 服务器 我用它来做各种事情 我希望它能够完成一些我需要定期完成的网络抓取工作 这段代码可以是在这里找到 http bit ly QeqvzX import sys from PyQt4 QtGui impor
  • 打开和关闭附加窗口 (QML)

    目前我有一个通过以下方式打开的窗口 property variant win Button id testButton MouseArea onClicked var component Qt createComponent test qm
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • 在 Qt 服务器上验证用户身份

    我正在尝试使用 C QtTcpSocket 为个人项目 多人国际象棋游戏 实现身份验证系统 我的朋友建议了一种验证用户的方法 但我想问是否有更简单或更好的方法 来自 Python 背景 做这个项目主要是为了加深对 C 的理解 我将发布我朋友
  • QComboBox 下拉项边距

    我想设计我的风格QComboBox为下拉项目留出边距 现在是这样的 我想要这样的东西 我尝试过 QComboBox QAbstractItemView item margin 3px 但它不起作用 你能帮我解决这个问题吗 您想在项目之间设置
  • 在 QtCreator 中使用 .pro 和 .pri 正确(树)显示 Qt 项目

    是否可以使用项目包含文件 pri 显示不止一个额外级别 例如如果 pro文件包括 pri文件包含两个 pri files pro pri pri pri 在 QtCreator 项目 中显示具有误导性 pro pri pri pri 它根本
  • QStyledItemDelegate 绘制自定义小部件失败

    在我的一个项目中 我使用的是QTableWidget为了显示一些复杂的计算结果 为了提高表格的可读性 我需要在单个表格单元格内显示两个对齐的值 后来我想通过使用颜色或箭头等来进一步自定义小部件 为此我源自QStyledItemDelegat
  • 第一次信号发射后自动断开

    我正在从文件加载网页 然后替换其中的一些 html self template web page QtWebKit QWebPage self template web page mainFrame load QtCore QUrl tem
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • 如何去除QWizard中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我尝试递归浏览所有小部件并将其边框设置为无 但似乎没有任何小部件具有此边框 这是我的代码 可以找到完整的可构建示例here https gist github com ardeid
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • QTabWidget 选项卡在垂直方向,但文本在水平方向

    我正在尝试用 C Qt 制作一个带有这样的侧边栏的应用程序 但是当将 QTabWidget 方向设置为西时 它会使文本垂直 如何让文本位于左侧 但水平对齐 PS 我不需要图标 提前致谢 您可以使用QListWidget http doc q

随机推荐

  • Cannot query the value of property ‘javaLauncher‘ because it has no value available.

    背景 使用 gradlew nativeCompile报错 原因 未配置JAVA HOME 参考链接 解决 配置JAVA HOME即可sudo vim etc profile export JAVA HOME opt graalvm jdk
  • python语言实现:已知一行由英文字母(A-Z,a-z)和数字(0-9) 组成的字符串的加密规则如下:大写英 文字母向后移1位,如A一B,B一C, 丫一Z,Z一A;小写英文字母向后移2位,如 a-c...

    用Python实现该加密规则 可以使用ord 和chr 函数 def encrypt s r for c in s if A lt c lt Z r chr ord c 1 elif a lt c lt z r chr ord c 2 el
  • 关于react-Ant Design框架Button按钮的基础用法

    前言 最近在学习react Ant Design框架 把button组件一些基础用法记录一下 引入框架 使用组件 基础按钮 首先我们得导入Ant Design和里面的button 才能进行使用 当然得确保之前在项目中你安装了Ant Desi
  • FPGA时序约束-设置伪路径和设置异步时钟

    什么是设置伪路径 伪路径是指该路径存在 但该路径的电路功能不会发生或者无须时序约束 创建伪路径的好处 可以减少工具运行优化时间 增强实现结果 避免在不需要进行时序约束的地方花费较多时间 设置伪路径一般用在 跨时钟域 一但上电就被写入数据的寄
  • dwr工具入门

    DWR是一个开源的类库 可以帮助开发人员开发包含AJAX技术的网站 它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数 就像它就在浏览器里一样 它包含两个主要的部分 允许JavaScript从WEB服务器上一个遵循了AJAX原
  • php THINKPHP5获取微信公众号access_token并存储

    需求背景 在TP5项目中 获取微信的access token并存储到Redis 并可以通过Redis查询access token 第一步 创建一个获取access token的方法 该方法需要向微信服务器发送请求 获取access toke
  • 设计模式的 C++ 实现---工厂方法模式(一)

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 前言 工厂模式通常适用于需要创建大量对象的情况 若仅需要一个对象 直接 new 即可 对于简单工厂模式 当需要增加新的产品时 需要对工厂类进行修改 违背了 开闭原则 对修改关闭
  • 技术栈

    1 微服务技术栈 微服务条目 技术 备注 服务开发 Springboot Spring SpringMVC 服务配置与管理 Netflix公司的Archaius 阿里的Diamond等 服务注册与发现 Eureka Consul Zooke
  • 翻转等价二叉树

    leetcode 翻转等价二叉树 我们可以为二叉树 T 定义一个翻转操作 如下所示 选择任意节点 然后交换它的左子树和右子树 只要经过一定次数的翻转操作后 能使 X 等于 Y 我们就称二叉树 X 翻转等价于二叉树 Y 编写一个判断两个二叉树
  • C API向MySQL插入批量数据的快速方法——关于mysql_autocommit

    MySQL默认的数据提交操作模式是自动提交模式 autocommit 这就表示除非显式地开始一个事务 否则每个查询都被当做一个单独的事务自动执行 我们可以通过设置autocommit的值改变是否是自动提交autocommit模式 查询当前数
  • 浏览器打不开网页 服务器停止响应怎么办,浏览器打不开未响应怎么办

    相信还有不少用ie浏览器的朋友 偶尔会遇到ie浏览器打不开或未响应的问题 那么对于浏览器打不开未响应的问题该怎么解决呢 接下来小编为大家分享解决方法 解决浏览器打不开问题 可以直接使用金山毒霸的电脑医生进行快速修复 以IE浏览器为例 下面就
  • 2. eMMC概述

    0 前言 本文主要参考eMMC规范 从总体上对eMMC 进行简要介绍 主要包含如下的内容 1 eMMC系统的总体架构 2 eMMC的总线协议 3 device controller 4 flash memory 1 eMMC系统总体架构 图
  • 无法启动 IIS express

    问题描述 1 在启动VS2013 调试项目的时候 提示 无法启动 IIS Exress 2 此问题只在打开某个项目时 提示此信息 3 打开事件查看器 看到错误内容为 在要求开始处理 http 请求时 应用程序池 Clr4Integrated
  • javaweb开发环境搭建-mac版

    一 安装jdk 1 检查 终端输入 java version mac自带jdk 但版本较低 如果自带版本满足需求 请跳过23步 2 安装或升级 官网下载 MAC OS版本的jdk安装 3 配置jdk环境变量 其实就是修改 bash prof
  • Ubuntu和树莓派的远程连接

    文章目录 一 Linux Ubuntu和树莓派 的远程连接操作 一 远程登录 1 Ubuntu远程登录 2 树莓派远程登录 二 Windows使用ftp远程登录实现上传和下载文件 1 Ubuntu系统 2 树莓派系统 三 Windows使用
  • 【计算机组成原理】——知识点复习(期末不挂科版)

    课本 考试题型 题型一 计算题 30分 1 定点数表示 用原码 反码 补码 移码表示十进制数 5分 2 浮点数表示 十进制数 单精度浮点数 5分 3 加减运算 变形补码 10分 4 乘除运算 补码一位乘法 Booth算法 原码加减交替法 不
  • 关于将本地jar包引入到项目中的方法。

    1 直接将下载的jar包通过配置引入到项目中 不推荐 比较限制 1 1 首先将自己所需要引入的jar包下载 1 2 打开idea 进入到项目中 在自己所需要引入jar包的模块下新建一个lib文件夹 跟src同级 1 3 将下载好的jar复制
  • 二进制多实例MYSQL

    上一篇部署了3306单实例mysql 先接上一篇部署多实例 一 创建多实例数据目录 mkdir p linux0224 mysql 3307 mkdir p linux0224 mysql 3308 二 初始化3307 3308数据库 my
  • React报错之React hook ‘useState‘ cannot be called in a class component

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Qt程式异常崩溃处理技巧(Win)

    文章转载来自 http www cnblogs com lcchuguo p 5177715 html 作者 lcchuguo 这篇文章谈的是 Qt4 程式在视窗系统下的异常崩溃处理技巧 所以须要在头文件里包括 include