在我上篇文章《
讓程式在崩潰時體面的退出之seh》中講解了seh中try/except可以捕捉異常,避免程式的崩潰,並且可以在處理完異常之後,還能決定進該程序如何執行。對於應用程式的使用者來說,並不知道異常的發生。但是對於軟體的開發者來說,雖然避免了程式的崩潰,可是這樣可以讓程式崩潰的缺陷存在於**中,就像乙個定時炸彈,不知道什麼時候會**。要想修復這樣的缺陷,首先要找到導致程式崩潰的那行**。而我在我的那篇《
讓程式在崩潰時體面的退出之dump檔案》裡面介紹了如何用dump檔案來定位使程式崩潰的**。這裡依然可以用同樣的方法。下面就是建立dump檔案的函式。
[cpp]view plain
copy
print?
// 建立dump檔案
// void createdumpfile(lpcwstr lpstrdumpfilepathname, exception_pointers *pexception)
// 建立dump檔案
// void createdumpfile(lpcwstr lpstrdumpfilepathname, exception_pointers *pexception)
從上面的**中可以看出,要想建立dump檔案,必須得到乙個指向exception_pointers結構的指標。怎麼在try/except塊中得到這個指標呢?這個時候就需要用到windows api中的getexceptioninformation()。這個函式的返回值就是乙個指向exception_pointers結構的指標。下面是具體的**。
[cpp]view plain
copy
print?
// 作為except塊中表示式的函式
//long crashhandler(exception_pointers *pexception)
int _tmain(int argc, _tchar* argv)
// 捕捉到讓程式崩潰的異常時建立dump檔案
//__except(crashhandler(getexceptioninformation()))
messagebox(null, _t("funcation completed"), _t("test"), mb_ok);
return 0;
}
// 作為except塊中表示式的函式
//long crashhandler(exception_pointers *pexception)
int _tmain(int argc, _tchar* argv)
// 捕捉到讓程式崩潰的異常時建立dump檔案
// __except(crashhandler(getexceptioninformation()))
messagebox(null, _t("funcation completed"), _t("test"), mb_ok);
return 0;
}
編譯上面的**並執行,會依次彈出下面這些對話方塊,並在c盤建立乙個dump檔案test.dmp。
有了dump檔案,就可以輕鬆定位使程式崩潰的那行**,具體方法可參考我的《讓程式在崩潰時體面的退出之dump檔案》。
讓程式在崩潰時體面的退出之SEH Dump檔案
在我上篇文章 讓程式在崩潰時體面的退出之seh 中講解了seh中try except可以捕捉異常,避免程式的崩潰,並且可以在處理完異常之後,還能決定進該程序如何執行。對於應用程式的使用者來說,並不知道異常的發生。但是對於軟體的開發者來說,雖然避免了程式的崩潰,可是這樣可以讓程式崩潰的缺陷存在於 中,...
強制退出 避免程式在關閉時崩潰
c 使用強制退出指令 在nglbexpmainfrm formclosing 中 process.getcurrentprocess kill vc中強制退出 exit 0 呼叫全域性或者靜態物件的析構函式然後退出 exitprocess 0 呼叫全域性或者靜態物件的析構函式然後退出 abort 不...
通過tmux讓程式在ssh退出後保持執行
ssh遠端登入到linux伺服器,執行乙個程式,在ssh退出時,該程式也將退出。一種解決辦法是通過nohup,此外也可以通過tmux解決該問題,並且每次斷開,再登入ssh都能回到原來的狀態,提供一種比較好的互動體驗。tmux和screen類似,是乙個終端復用器。安裝tmux後,在執行任務前先執行tm...