【異常處理】MFC程序崩潰的友好處理

軟件總存在這樣或者那樣的bug。

雖然測試員已經在很努力的尋找問題,程序員也在汗流浹背的除蟲,但是總會有一些情況被遺漏或者不可預測,比如用戶的硬件環境、網絡狀況、操作系統差異等等,不一而足。而導致的結果則是彈出下面這樣一個讓用戶摸不着頭腦又惱火的提示,然後崩潰掉,令程序員尷尬不已。

 

而在一些成熟的軟件產品中,程序崩潰時我們看到的卻是另外一番畫面,比如QQ:

 

又比如迅雷:

 

你也想讓你的程序擁有友好的崩潰界面,降低用戶生氣的能量,並且收集一些必要的信息進行調試,來完善你的程序嗎?如果你是MFC程序猿,請繼續圍觀,其他猿類請自行無視,並尋找適合你的猿糞。

其實MFC框架已經爲我們考慮到這個問題,只是默認生成的應用程序框架沒有包含進去而已。實現這個功能的核心是函數:SetUnhandledExceptionFilter,想要了解這個函數的同學請查閱MSDN,這裏就不再贅述他的用法。本着複用主意的精神,本文介紹的內容來自於大家所熟悉的電驢(emule)的源代碼,電驢實現了上面那樣的功能,我只是把代碼從電驢裏拿出來加到自己的程序裏然後到這裏分享給你。

毫無疑問,電驢是一款優秀的軟件,並且在它華麗的外表下還有一副強壯的身體。它的代碼有非常優秀。它是基於MFC開發的開源程序,需要源代碼的同學請猛擊這裏 https://github.com/baloonwj/easyMule 下載。

上面這幅圖就是電驢的源代碼包,我們要用到的就是那個被我選中的“CrashReporter”,它是一個獨立的工程,我們只需要根據需要做一些修改然後直接編譯即可。

另外我們還需要位於srcWorkLayer目錄下的mdump.h和mdump.cpp,把這兩個文件拷貝並加到你的工程裏,然後把mdump.cpp裏的下面這行去掉:

#include “CheckConflict.h”    //ADDED by fengwen on 2006/12/25    : 檢測已知的第三方軟件衝突。

 

這個是用於檢測已知的會和電驢衝突的軟件,不再本文討論之列,有興趣的同學請自行研究。另外把TopLevelFilter函數裏的下面幾行也刪掉:

try
{
    //ADDED by fengwen on 2006/12/25    <begin> :    檢測第三方軟件衝突。
    CCheckConflict    cc;
    if (cc.CheckConflict(pExceptionInfo))
    {
        ExitProcess(1);
    }
    //ADDED by fengwen on 2006/12/25    <end> :    檢測第三方軟件衝突。
}
catch(…)
{
}

 

最後一步,在主程序框架類裏添加:

#include “mdump.h”

再到InitInstance函數裏添加下面的代碼:

theCrashDumper.Enable(_T(“YourApp 1.0″), false);

好了,大功告成,現在編譯你的程序,在合適的地方增加測試代碼就可以實驗效果了。比如下面這兩行代碼會讓你的程序立即崩潰:

int* pt = 0;
*(pt+1) = 5;

怎麼樣,效果還不錯吧?這個程序除了攔截進程異常,還能夠將異常的相關信息生成文件,然後上傳到你指定的服務器,供你分析調試。當然你需要修改CrashReporter工程HttpUploadFileProc.cpp文件HttpUploadFile函數裏相關變量的值,否則就上傳到到電驢的服務器了。另外你還需要在你服務器的WEB server上提供一個接收文件上傳的程序,用來保存用戶上傳的錯誤文件。

 

最後再修改一下CrashReporter工程CrashReporter.cpp文件InitInstance函數裏的下面這行代碼:

ShellExecute(NULL, “open”, “eMule.exe”, NULL, NULL, SW_SHOW);

把eMule.exe改爲你程序的文件名,要不然用戶的程序崩潰後在屏幕上看到的是一隻可愛的驢子,大概整個人也要被你搞崩潰了……
--------------------- 
作者:zhongguoren666 
來源:CSDN 
原文:https://blog.csdn.net/zhongguoren666/article/details/8372532 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章