日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/31 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt程式异常崩溃处理技巧(Win) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Qt程式異常崩潰處理技巧(Win)

這篇文章談的是 Qt4 程式在視窗系統(tǒng)下的異常崩潰處理技巧。所以須要在頭文件里包括“#include <Windows.h>”。

首先,程式難免會有異常崩潰的時候。重要的是在崩潰時能及時把重要的數(shù)據(jù)保存好,將損失減少。


SetUnhandledExceptionFilter函數(shù)是Win32API的異常捕獲函數(shù),在程式異常結(jié)束前。會調(diào)用該函數(shù)注冊的回調(diào)函數(shù),這樣就能在進(jìn)程終止前運行指定的代碼,達(dá)到比如保存數(shù)據(jù)的功能。

LONG?ApplicationCrashHandler(EXCEPTION_POINTERS?*pException){//程式異常捕獲/****保存數(shù)據(jù)代碼****///這里彈出一個錯誤對話框并退出程序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>對于發(fā)生的錯誤,表示誠摯的歉意</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);//注冊異常捕獲函數(shù)MainWindow?w;w.showMaximized();return?a.exec(); }

保存數(shù)據(jù)僅是拯救措施,更重要的是找到錯誤的根源。若能在崩潰的同一時候,程式自己主動記錄下崩潰時的執(zhí)行信息,將有助于修正工作。微軟提供了“DbgHelp”錯誤調(diào)試技術(shù)。調(diào)用相關(guān)功能就可以保存程式崩潰時的信息,然后借助WinDbg軟件就能分析出當(dāng)時的執(zhí)行狀況。

調(diào)用“DbgHelp”的MiniDumpWriteDump函數(shù)保存以“.dmp”為后綴的Dump文件,該文件能被WinDbg讀取并分析。

你須要加入頭文件“#include <DbgHelp.h>”,在Pro文件里加入“LIBS += -lDbgHelp”。目的是鏈接DbgHelp庫。


LONG?ApplicationCrashHandler(EXCEPTION_POINTERS?*pException){//程式異常捕獲/****保存數(shù)據(jù)代碼****///創(chuàng)建?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文件內(nèi)容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>對于發(fā)生的錯誤,表示誠摯的歉意</b><br/></div>"+QString("<div>錯誤代碼:%1</div><div>錯誤地址:%2</div></FONT>").arg(errCode).arg(errAdr),QMessageBox::Ok);return?EXCEPTION_EXECUTE_HANDLER; }

當(dāng)被錯誤困擾得焦頭爛額的時候。若是老天能直接告訴錯誤在哪一行代碼該有多好呀。其實WinDbg就能做到。

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

這句話的目的是Release版也將生成“.pdb”后綴的調(diào)試信息文件。在使用WinDbg導(dǎo)入Dump前。指定好源代碼與pdb文件的位置。就可以在錯誤報告內(nèi)看到罪魁禍?zhǔn)资悄囊恍写a


轉(zhuǎn)載于:https://blog.51cto.com/11496263/1872974

總結(jié)

以上是生活随笔為你收集整理的Qt程式异常崩溃处理技巧(Win)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。