讓程式在崩潰時體面的退出之SEH Dump檔案

2021-06-22 02:30:42 字數 1653 閱讀 1929

在我上篇文章《

讓程式在崩潰時體面的退出之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...