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

这篇文章谈的是 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文件的位置。就可以在错误报告内看到罪魁祸首是哪一行代码

转载于:https://blog.51cto.com/11496263/1872974

Qt程式异常崩溃处理技巧(Win)相关推荐

  1. 处理 程序异常崩溃后的善后工作

    好像以前面试被问过,没回答出来,但一直没用到过,也就没研究. 今天看了些代码,发现要实现崩溃后的处理,竟然很简单. 看来很多东西只是见没见过,没见过觉得很神奇,见过了其实也没啥. 要实现程序异常崩溃后 ...

  2. 腾讯Bugly异常崩溃SDK接入

    首先登入Bugly,创建应用,记录下AppId ①下载SDK,通过Cocoapods集成 pod 'Bugly' #腾讯异常崩溃日志服务 ②导入头文件,并初始化 /** 腾讯Bugly */#impo ...

  3. qt 程序异常结束。_博声医疗:QT间期,QT间期正常范围

    QT间期(简称QT)包括心室除极和复极激动时间,代表心室去极化和复极化过程的总时程,为自QRS波的起点至T波的终点所占的时间,测定值随年龄和性别而变化.据博声医疗了解到,QT间期与心率快慢有密切关系, ...

  4. Notepad++ 异常崩溃 未保存的new *文件列表没了怎么办?

    Notepad++ 异常崩溃 未保存的new *文件列表没了怎么办? 参考文章: (1)Notepad++ 异常崩溃 未保存的new *文件列表没了怎么办? (2)https://www.cnblog ...

  5. 记一次 .NET 某教育系统 异常崩溃分析

    一:背景 1. 讲故事 这篇文章起源于 搬砖队大佬 的精彩文章 WinDBg定位asp.net mvc项目异常崩溃源码位置 ,写的非常好,不过美中不足的是通览全文之后,总觉得有那么一点不过瘾,就是没有 ...

  6. 使用Vistual Studio N年,推荐2个异常捕获的技巧

    点击上方"dotNET全栈开发","设为星标" 加"星标★",每天11.50,好文必达 全文约1600字,预计阅读时间3分钟 这个n到底是多 ...

  7. java异常——分析堆栈跟踪元素+使用异常机制的技巧

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--分析堆栈跟踪元素+使用异常机制的技巧 的相关知识: [1]分析堆栈跟踪元素相关 ...

  8. com.haodf.android,有坑!Android新版QQ获取packageInfo引发异常崩溃

    起因 最近从错误日志中检查到一个异常崩溃: java.lang.RuntimeException: Package manager has died at android.app.ActivityTh ...

  9. java语言中application异常退出和线程异常崩溃的捕获方法,并且在捕获的钩子方法中进行异常处理

    java语言中application异常退出和线程异常崩溃的捕获方法,并且在捕获的钩子方法中进行异常处理 参考文章: (1)java语言中application异常退出和线程异常崩溃的捕获方法,并且在 ...

最新文章

  1. C++所提供的类模板应用(堆栈)
  2. 越小越好:为什么电子器件都这么小巧玲珑?
  3. Lucene教程--Analyzer分析器详解
  4. 激活,数据存储,吐司
  5. (2) ebj学习:hello world入门案例
  6. c json保存整型数组,您如何存储“ int”? NSMutableArray *或NSMutableDictionary *中的值?整数形式的JSON数据的长期问题。...
  7. nginx设置http强制跳转https
  8. 通用easyui查询页面组件
  9. 服务器系统无法使用gdt,《自己动手写操作系统》第三章第一个程序的问题。bochs加载后出现no bootable device.我在网上查了下,说是因为第一扇区最后2字节...
  10. 回溯法之迷宫问题(华为笔试题)
  11. 利用Sen2cor工具对哨兵2影像进行大气校正和辐射校正
  12. 自检、开机故障及主板厂商资料
  13. 酷客数据python基础实战答案_英语听力练习_日语_韩语_法语听力训练网站-沪江听力酷...
  14. 'Data_Label_Tools - 开源数据标注工具大列表
  15. IMX6Q开发板使用USB直接连接HP LaserJet 1020 plus打印机打印。
  16. 华为手机 图标消失_华为手机桌面图标不见了怎么办
  17. 教授专栏14 | 陈泰元: 提升公司治理之路--高管薪酬追回条款
  18. 10月 区块链领域投融资事件
  19. 微服务Feign调用后开启Schedule报错No thread-bound request found: Are you referring to request attributes outsid
  20. 负熵作为非高斯的度量

热门文章

  1. DevExpress VCL Controls v15.1.5正式发布[附下载]
  2. OCA读书笔记(1) - 浏览Oracle数据库架构
  3. linux查看openssh和openssl版本
  4. 获取自定义data的几种属性
  5. JavaScript特点、优缺点及常用框架
  6. Session的实现与存储
  7. 纯CSS实现漂亮圆角阴影边框
  8. 为什么乱码:meta http-equiv=content-type前的非ANSI字符
  9. 关于HttpModule
  10. 关于前后端交互的一些基础知识点