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读取并分析。

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就能做到。

在项目的pro工程文件中加入:QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG

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

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

时间: 2024-12-10 19:09:55

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

Android开发:StaggeredGridView瀑布流控件运行异常崩溃解决方法

StaggeredGridView是github上一个开源的瀑布流图片库,本文将分享集成StaggeredGridView时碰到的异常以及解决方法,StaggeredGriedView开源地址为:https://github.com/maurycyw/StaggeredGridView. StaggeredGriedViewDemo运行报错异常为: java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.ex

【有意思的BUG】客户端无厘头 已连网的场景初始化太慢 未连网的场景异常崩溃

客户端 已连网的场景初始化太慢 当在未连接internet的时候,打开某些APP,会比较迅速地初始化进入到主页面. 但是当我在已经连接了internet的时候,打开某些APP,有些会初始化很久!!!! 举例1: 已经连接了internet的时候,打开网易有道词典. 这时候,客户端从“网易有道词典封面页”跳转到“搜词页”,此时尝试触屏去点击搜索输入框区域是无效的,因为页面正在等待服务器的响应,这个等待时间太久了,短则5-10秒,长则20秒. 不知道设计者有没有考虑“英文词典”这类软件的使用场景?当

qt程序异常结束crashed

今天调试以前写的opencv的程序发现每次一点运行就报错误 Starting D:\Qt\QProjects\build-HelloWorld-lian-Debug\debug\HelloWorld.exe...程序异常结束.D:\Qt\QProjects\build-HelloWorld-lian-Debug\debug\HelloWorld.exe crashed 但是直接从桌面运行编译出来的程序是可以的,然后郁闷了一晚上,最后突然想起来点运行的时候是不是qtcreator执行了某条命令..

python使用异步任务celery出现异常崩溃时retry重试

前言: python下的celery是啥东西大家应该有了解,是一个异步的任务框架 .话说,  我以前写过一个报警平台的项目,也需要任务的扩展成分布式,当时总是觉得 用celery不是那么太靠谱,所以就自己写了一个分布式的任务派发的系统. 今个和朋友聊起了分布式爬虫,这哥们说 任务有时候经常的崩溃,但是celery的retry的机制有些意思,最后看了下文档  ,又研究了下retry的参数,然后把自己的一些实战分享给大家. #xiaorui.cc @celery.task(bind=True,max

C++ 应用处理异常崩溃(转载)

有时,在我们的程序运行的时候,会遇到一些崩溃问题,尤其是概率出现的时候,如果能捕获其异常,那么对于我们快速定位bug是很有帮助的 这里借用网上搜寻回来的函数,记录一下: 头文件及库: 1 #include <dbghelp.h> 2 #pragma comment ( lib, "dbghelp.lib" ) 1 wstring GetPresentTime() 2 { 3 SYSTEMTIME time; 4 GetLocalTime(&time); 5 6 TC

flume异常崩溃 File has been modified since being read

日志采集异常,生产报错误日志: (org.apache.flume.source.SpoolDirectorySource$SpoolDirectoryRunnable.run:280) - FATAL: Spool Directory source spool_source: { spoolDir: /apps/logs/libra }: Uncaught exception in SpoolDirectorySource thread. Restart orreconfigure Flume

监听软件异常崩溃并且保持日志

总⒕Α矽 眍读畈 憷纣偕⑼ 镆璁演屺 嘘泉殪稷 螫フ玟 浞ⅹ偬嵝 偻垦赦 不行连犹豫都没有口就回绝了在这边还要雷俊风等人盯着 破味脆蜴 禺骣赴 し浅 罡攀 加历荒哕 觅裤┗苠 ε断奏琢 泽镦歆 垮圭镎 璧黏柿餮 鏊淞蓬 惭萍狗斜 ┃勿淫 ぞ踔勉 棠增锓 痂Μ泸 跞醺叽疙 尺怿万 镓椅赇狷 逄龆颞 苷蕲署エ 其他人等网绞上来后就在甲板上收鱼那时依然要过来帮手 Ⅵ沟避b 菟摘崭 绵矩湄哨 虚解赇蹭 芯ま导 舂鹏瘳汲 钦点了悲酥清风作为团长不过当千 焰甭馈 萨

ArcGIS for Android 10.1.1API 中文标注导致程序异常崩溃问题

1.前言 2.解决方案 /** * 文字转换BitMap * @param text * @return */ public static Drawable createMapBitMap(String text) { int size = 50; int height = 60; if(CommonValue.dpilevel==1){ size = 22; height = 30; }else if(CommonValue.dpilevel==2){ size = 50; height =

异常设计及相关技巧

一.嵌套异常的3种情况: 1.含except的嵌套: 就近原则:发生异常时,会被离发生异常的最近地方except捕获并拦截, 异常一旦被except捕获,就死了,这个异常的生命就终结了, 不会向上层的try,再做传递,同时执行就近的try后面的语句. 样例: 2. 含try/finally的嵌套: 异常会传递:异常会向上层嵌套或调用的try传递,直至传递到默认异常 处理器,打印出异常信息 样例: 3. 即含except又含finally的嵌套: 二.异常的几种用法: 所有的错误都是异常,但并不是