我有一個DLL被注入到非常舊的bug中,現在它的開發者應用程序不支持它。有時候該應用程序崩潰了,我需要一些方法來從字面上捕獲所有可能出現的未處理異常(來自DLL),以保存數據並且只允許應用程序崩潰。我怎樣才能做到這一點?如何在C++/Windows中捕獲EVERY異常?
現在,有一個外部調試器用於這個目的,但它太慢了,也是越野車保持這種方式。
我有一個DLL被注入到非常舊的bug中,現在它的開發者應用程序不支持它。有時候該應用程序崩潰了,我需要一些方法來從字面上捕獲所有可能出現的未處理異常(來自DLL),以保存數據並且只允許應用程序崩潰。我怎樣才能做到這一點?如何在C++/Windows中捕獲EVERY異常?
現在,有一個外部調試器用於這個目的,但它太慢了,也是越野車保持這種方式。
您必須啓動一個宿主DLL的新進程。如果DLL將崩潰,無論你喜不喜歡,它都會降低這個過程。當然,您可以嘗試捕獲異常或類似情況,但是如果拋出異常,則意味着內存已損壞。 It is better to crash catastrophically than to have the program continuing to run in an inconsistent state.
windows shell是一個實際做到這一點的程序 - 它在代理過程中啓動了一些插件,這樣如果插件崩潰,它不會導致整個shell。您需要使用進程間通信在您和您開始的代理之間進行通信。
對不起,但我想在崩潰之前讓主應用程序保存數據,而不是防止它崩潰。 – uber 2011-05-27 04:06:31
+1贊同,代理主機絕對是最好的方法。 – 2011-05-27 04:12:52
@uber:「保存數據」是「繼續運行」 - 你怎麼知道崩潰的組件沒有銷燬你想保存的數據? (畢竟,野生指針可以覆蓋自己的數據)當用戶發現程序崩潰時,他們現在肯定不會高興,因爲他們現在已經破壞了他們在磁盤上的工作。 – 2011-05-27 04:13:39
對不起,剛剛找到解決方案。 [SetUnhandledExceptionFilter](http://msdn.microsoft.com/en-us/library/ms680634.aspx)是我需要的。 – uber 2011-05-27 04:22:30