1. 程式人生 > >qt處理程式異常崩潰

qt處理程式異常崩潰

程式難免會有異常崩潰的時候,重要的是在崩潰時能及時把重要的資料儲存好,將損失減少。

儲存資料僅是拯救措施,更重要的是找到錯誤的根源。若能在崩潰的同一時候,程式自己主動記錄下崩潰時的執行資訊,將有助於修正工作。微軟提供了“DbgHelp”錯誤除錯技術。呼叫相關功能就可以儲存程式崩潰時的資訊,然後藉助WinDbg軟體就能分析出當時的執行狀況。呼叫“DbgHelp”的MiniDumpWriteDump函式儲存以“.dmp”為字尾的Dump檔案,該檔案能被WinDbg讀取並分析。

在標頭檔案裡包括“#include <Windows.h>”。

加入標頭檔案“#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;
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);//註冊異常捕獲函式
    MainWindow w;
    w.show();
    return a.exec();
}

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

在專案的proproject檔案裡增加:QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG

這句話的目的是Release版也將生成“.pdb”字尾的除錯資訊檔案。在使用WinDbg匯入Dump前。指定好原始碼與pdb檔案的位置。就可以在錯誤報告內看到罪魁禍首是哪一行程式碼。


相關推薦

qt處理程式異常崩潰

程式難免會有異常崩潰的時候,重要的是在崩潰時能及時把重要的資料儲存好,將損失減少。 儲存資料僅是拯救措施,更重要的是找到錯誤的根源。若能在崩潰的同一時候,程式自己主動記錄下崩潰時的執行資訊,將有助於修正工作。微軟提供了“DbgHelp”錯誤除錯技術。呼叫相關功能就可以儲

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

     文章轉載來自     http://www.cnblogs.com/lcchuguo/p/5177715.html     作者 lcchuguo 首先,程式難免會有異常崩潰的時候。重要的是在崩潰時能及時把重要的資料儲存好,將損失減少。 SetUnhandl

程式異常崩潰後用windbg輔助除錯解決的經驗

狀況:我的程式呼叫別人的庫做 檔案寫入工作。           在這一過程中出現異常,程式崩潰。           經反覆檢查,認為自己的程式沒有錯,但無法判斷在別人庫裡哪裡有錯。   &

Python小白處理程式異常,就用異常捕獲!

  異常處理在之前的學習中我們一直沒有接觸過。 知道怎麼向程式輸入一段字串呢?那麼我們在這裡提供一個小例子。 學習Python中有不明白推薦加入交流裙                 號:73

一種處理vs2017異常崩潰的方法

01 vs2017 對於大工程頻繁崩潰 在除錯chromium程式碼的時候,vs2017有時會頻繁出現崩潰。 優先嚐試: 工具==>選項==>除錯==>常規 [一個程序中斷時則中斷所有程序] 的勾選去掉。 還可以嘗試如下操作: 1 嘗試刪除

Android 對程式異常崩潰的捕捉

由於Android裝置各異,第三方定製的Android系統也非常多,我們不可能對所有的裝置場景都進行測試,因而開發一款完全無bug的應用幾乎是不可能的任務,那麼當應用在使用者的裝置上Force Close時,我們是不是可以捕獲這個錯誤,記錄使用者的裝置資訊,然後讓使用者選擇是否反饋這些堆疊資訊,通過這

程式異常崩潰捕捉-dmp檔案及Windbg分析

#include <dbghelp.h>       #include <shellapi.h>       #include <shlobj.h>                     // 自定義的exectpion filter       LONG WINAPI

universal-image-loader載入圖片,程式異常崩潰,圖片不在載入顯示問題

主要是發現universal-image-loader 用來在載入圖片的時候,如果程式異常崩潰了,那麼在自動重啟程式的時候,universal-image-loader會出現在快取讀取圖片的問題,解決方式為 new DisplayImageOptions.Builde

python_python中try except處理程式異常的三種常用方法

python中try except處理程式異常的三種常用方法 如果你在寫python程式時遇到異常後想進行如下處理的話,一般用try來處理異常,假設有下面的一段程式: 1 2 3 4 5 6 7 8 try: 語句1 語句2 . .

qt opencv 程式異常結束

正如標題所示:你自己在Qt中配置好後opencv後,測試的時候出現 程式異常結束。。。。 但是你編譯程式碼的時候卻沒有錯,那麼很有可能就是你的動態連結庫沒有載入到系統的環境中去。 解決辦法: 1、

android 應用程式異常崩潰捕捉

import java.io.BufferedReader;  import java.io.File;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import java

Android 對全域性程式異常崩潰的捕捉

以下為異常捕捉處理程式碼: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F

python中try except處理程式異常的三種常用方法

轉載自:http://www.pythontab.com/html/2013/pythonjichu_0204/210.html 如果你在寫python程式時遇到異常後想進行如下處理的話,一般用try來處理異常,假設有下面的一段程式: 1 2 3 4 5 6 7 8 try:

Qt程式出現(ig9icd64.dll) (XXXXX.exe 中)處有未經處理異常: 0xC000041D: 使用者回撥期間遇到未經處理異常。。

我也是被自己逼瘋了,中午還在一邊執行程式,一邊寫部落格。休息了一會,再執行程式,發現好好地程式居然跑不起來(估計也是去休息了),居然出現這個bug。 於是下午進行了各種除錯,註釋程式碼,最終確定了問題在QOpenGLWidget裡面。但是這個我也動不了,於是再次找原因,找啊找,找了一下

Qt中關於release版本程式異常結束問題

BaoBao and DreamGrid are playing a game using a strange button. This button is attached to an LED light (the light is initially off), a co

Java——使用try...catch與throws處理程式執行的異常

     1.異常:異常就是Java程式正在執行過程中出現的錯誤     2. 兩種處理異常的方式:try catch,throws      3.Throwable子類有Error,Exception; Exception子類有RuntimeException(執行時異常)

程式異常VC偵錯程式無法定位的處理

最近除錯程式發現空指標老無法定位, 使用一個最簡單的main函式做空指標檢查也一樣, 具體症狀見圖 pdb載入是正常的, 但是堆疊沒顯示如此簡單的空指標訪問位置. Google了以下 解決方法: Debug->Exception中將所有異常勾選即可 不知道哪裡的設定導致如此詭異的問題, 害

Android崩潰處理異常收集

目前為止也經歷了好幾個專案了,每個專案都會避免不了crash。這裡就總結一下專案的異常處理。下面介紹一下系統提供的異常處理方法。 1.系統異常處理類。 /** * Interface for handlers invoked when a <tt>T

Qt程式異常結束

解決Qt程式異常結束 Qt程式異常結束如下圖所示: 出現這種情況一般是庫檔案載入的問題,因為程式編譯通過並且沒有報錯,然而程式卻沒有執行起來,這個時候的錯誤應該屬於連結庫檔案錯誤。 連結時出錯 解決辦法: 1、如果有動態庫,需要將動態庫複製到exe(執行檔案)的同一級目錄下;

自定義VS程式異常處理及除錯Dump檔案(一)

1. Dump檔案 1. Dump檔案介紹 Dump檔案(Dump File),也叫轉儲檔案,以.DMP為檔案字尾。dump檔案是程序在記憶體中的映象檔案,通過轉換然後儲存成以.DMP字尾的檔案。dump檔案根據儲存時的選項不同,會生成不同大小的檔案,其