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

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

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,"程式崩溃","

对于发生的错误,表示诚挚的歉意

"+

QString("

错误代码:%1
错误地址:%2

").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 ”,在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,"程式崩溃","

对于发生的错误,表示诚挚的歉意

"+

QString("

错误代码:%1
错误地址:%2

").arg(errCode).arg(errAdr),

QMessageBox::Ok);

return EXCEPTION_EXECUTE_HANDLER;

}

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

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

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

linux qt程序崩溃_Qt程式异常崩溃处理技巧(Win)相关推荐

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

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

  2. linux qt程序编译出错,QTcreator编译出错

    作为移植性很好的QT图形开发工具,他支持windows,linux,FBS,macos,Symbian等OS, 在windows下的QT程序在安装了QTcreator后很快就编译出来了, 可是在我的r ...

  3. Linux qt程序打包依赖库,Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)...

    本文介绍如何打包Qt程序,使其在没有安装Qt的系统可以运行. 默认前提:另外一个系统和本系统是同一个系统版本. 1,编写导出依赖包的脚本copylib.sh #!/bin/bash LibDir=$P ...

  4. linux qt程序崩溃_Lubuntu 20.04 点评:轻量、简约、文雅 | Linux 中国

    Lubuntu 20.04 LTS 与之前的 LTS 版本有很大的不同.它旨在给你一个更完善的体验,而不仅仅是关注旧电脑.请关于 Lubuntu 20.04 的内容.https://linux.cn/ ...

  5. linux qt程序崩溃_【工程师分享】在MPSoC上运行基于eglfs_kms的QT应用程序

    作者:付汉杰,hankf@xilinx.com 文章转载自:赛灵思中文社区论坛 1Xilinx backend Xilinx为MPSoC支持4种libMali的backend: X11, Waylan ...

  6. qt msvc 版本 移植 linux,Qt 程序异常结束 (MinGW 与 MSVC 版本切换)

    引言 针对Qt的两种版本,是不是有很多的疑惑,或者说在切换时,遇到了程序异常结束,函数未定义等很多奇怪的问题?今天我们来对常见的几种问题进行分析与解决. 简介 操作系统:window7 x64 编程I ...

  7. Linux Qt程序打包

    前言 当我们在linux系统上开发一些工具时,想快速分发给相关人员使用时,我们可以把开发的相关依赖进行打包,然后分发使用,其中打包过程中遇到一些问题,在没有安装Qt的机器上运行回报缺少xcb库,通过l ...

  8. linux qt 添加动态链接库_Qt 连接MySql数据库

    Qt默认是不含Mysql驱动的,所以我们需要手工编译Mysql动态链接库,以Win平台举例. 前期准备 下载mysql 数据库 qt5.13.1使用的是mysql-5.7.25,其他版本没有测试 下载 ...

  9. linux QT 程序自启动,Qt Windows下开机自动启动自己的程序

    JSP复习整理(四)Cookie 一.useCookie.html Go项目结构和模块导入 Go项目结构和模块导入 golang项目结构与其他语言类似,但是仍然有一些需要注意的地方. 项目结构 环境配 ...

  10. Linux Qt程序命令行可以打开,双击打不开解决

    主要设置两步: 1.在源码工程的*.pro文件中添加如下语句生成可执行文件: QMAKE_LFLAGS += -no-pie 2.进行第一步操作后,如果还是打不开,应该是你的程序引用了第三方库,需要将 ...

最新文章

  1. nginx实现请求的负载均衡 + keepalived实现nginx的高可用
  2. 脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别
  3. 验证字符串是否为汉字
  4. mysql 表 地图_报表中的地图怎么做?
  5. 彼聆智能语音机器人_电销行业的人工智能:智能语音电话机器人
  6. 服务器安全之iptables iptables
  7. 白皮书 | 以太坊 (Ethereum ):下一代智能合约和去中心化应用平台
  8. linux过滤端口抓包_TCP 协议三次握手抓包分析amp;查看状态
  9. connect by prior id= pid start with id='1' 树结构查询
  10. *第十五周*数据结构实践项目一【验证哈希表及其算法】
  11. EFR32FG1开发教程1--点亮LED
  12. 从山寨机看手机的未来
  13. laravel 框架使用hdjs 实现单图上传功能
  14. 解决ubuntu系统使用vim时方向键乱跳问题
  15. 【探索HTML5第二弹03】走近地图应用的世界,看我们google地图可以看些什么!
  16. Excel宏的录制与调用
  17. 节点操作之父子节点和下拉框
  18. ios 内购开发,passbook,蓝牙
  19. ? ?. ?? ??=的用法
  20. 负载均衡服务器性能数据,用缓存服务器负载均衡 提数据库查询效率

热门文章

  1. Dex2Oat执行参数总结
  2. android长度测量工具,手机测量尺子工具
  3. Docker 容器中添加字体
  4. 国内外实行HACCP情况(转载)
  5. 什么是网络分析仪?它的重要技术指标有哪些?
  6. 室内定位——卡尔曼滤波原理、Matlab与javascript实现
  7. android脚本,安卓好用的脚本程序—Gscript
  8. Unity UGUI坐标与世界坐标转换
  9. SPSS中字符串转为数值后数据消失的解决办法
  10. 全面解析抖音直播各类玩法;新人也能快速直播。