程式崩潰的問題解決了,問題是,有很多時候,很多程式是不允許隨便崩潰的,這樣,在程式崩潰後再去發現問題就有些晚了,那麼,有沒有程式不崩潰時也能發現問題的方法呢?前面描述的seh就是一種讓程式不崩潰的方法,不過在那種方式下,按以前描述的方法,崩潰是不崩潰了,但是實際上,掩蓋了很多問題,對於問題的發現有些不利的地方。本文前面描述過了,minidump是一種快速發現問題的好方法,但是卻沒有辦法避免程式崩潰,那麼終極辦法是啥呢?我們的目的既然是程式不崩潰+快速發現問題,那麼終極辦法自然就是seh+minidump了:)seh和minidump都是windows的特性,ms也的確提供了結合的方式。見下面的例子,呵呵,別太激動了。。。。這也是我們公司的伺服器從內測時一天多次無任何通知,預告,警告的崩潰(總監甚至還曾因為我的問題,半夜3點爬起來解決伺服器崩潰問題)到現在伺服器基本做到永不崩潰,即便出現問題了也有充足的時間從容的解決,然後在伺服器中發通告,告訴檔案伺服器需要臨時維護。。。。呵呵,都依賴於此終極解決方案。。。。。
要想利用minidumpwriteminidump,需要獲取的是minidump_exception_information
結構的資訊,這個結構中最重要的資訊**於pexception_pointers的資訊,這個資訊在上述的例子中是在程式崩潰的時候,由windows作為引數傳入我們設定好的異常處理函式的,現在最主要的問題就是從**獲取到這個異常資訊了,通過msdn,我們查到了getexceptioninformation的函式,返回的就是這個資訊,見msdn:
lpexception_pointers getexceptioninformation(void);
不過,這裡ms給出了乙個notice:
事實上,剛開始我使用的時候,哪個地方都試遍了,果然都是報編譯錯誤。因為此函式使用方式如此奇怪,並且沒有example。。。。。最後在絕望中。。。看到了platform builder for microsoft windows ce 5.0的詞函式的說明,裡面有個說明,然後我**了。。。。
try
except (filterfunction(getexceptioninformation())
原來是這樣使用的啊。。。。。。。。。。暈
handlewithoutcrash例子:
#include #include using namespace std;
#pragma auto_inline (off)
#pragma comment( lib, "dbghelp" )
// 為了程式的簡潔和集中關注關心的東西,按示例程式的慣例忽略錯誤檢查,實際使用時請注意
long winapi myunhandledexceptionfilter(
struct _exception_pointers* exceptioninfo
)void fun2()
else
}__except(myunhandledexceptionfilter(getexceptioninformation()))
} void fun()
int main()
這裡例子中,你可以除錯程式了,因為程式不會崩潰,這樣vs不會和你搶異常的控制。同時,看到dump檔案的同時,也可以看到,程式實際上是繼續執行了下去,因為messagebox還是彈出來了。這。。。就是我們想要的。。。。。
這裡有幾個要點,getexceptioninformation()僅僅只能在__except的ms所謂的filter中呼叫,其他地方會報編譯錯誤,其次,返回的值和一般的__except的意義是一樣的,要想程式執行,需要返回exception_execute_handler表示異常得到了控制。其他幾個值的含義見前篇的seh。
【注】:
上面blog中的demo也用到了此技術
讓程式在崩潰時體面的退出之SEH Dump檔案
在我上篇文章 讓程式在崩潰時體面的退出之seh 中講解了seh中try except可以捕捉異常,避免程式的崩潰,並且可以在處理完異常之後,還能決定進該程序如何執行。對於應用程式的使用者來說,並不知道異常的發生。但是對於軟體的開發者來說,雖然避免了程式的崩潰,可是這樣可以讓程式崩潰的缺陷存在於 中,...
讓程式在崩潰時體面的退出之SEH Dump檔案
在我上篇文章 讓程式在崩潰時體面的退出之seh 中講解了seh中try except可以捕捉異常,避免程式的崩潰,並且可以在處理完異常之後,還能決定進該程序如何執行。對於應用程式的使用者來說,並不知道異常的發生。但是對於軟體的開發者來說,雖然避免了程式的崩潰,可是這樣可以讓程式崩潰的缺陷存在於 中,...
程式崩潰原因總結
測試環境 redhat 程式跑飛原因分析 程式崩潰分析 指標,空指標使用 null 非法指標 0x00000000 棧溢位,strcpy拷貝長字串到區域性變數 格式化串,printf漏寫或多寫變數 堆溢位,malloc會儲存一些控制資料 元資料 在分配給使用者的記憶體塊前 後位置。include i...