我試圖使用類似於clrdump代碼在我管理的過程中創造迷你轉儲。生產微型轉儲在混合代碼DLL _caught_ SEH異常
該管理進程調用C++/CLI代碼調用一些本地C++靜態庫代碼,其中SEH異常可能拋出(例如偶爾的訪問衝突)。
C# WinForms
->
C++/CLI DLL
->
Static C++ Lib
->
ACCESS VIOLATION
我們的政策是製作所有SEH異常小型轉儲(抓&未捕獲的),然後將其轉化爲C++異常由應用程序代碼來處理。這工作純粹原生進程就好了;但是當應用程序是一個C#應用程序時 - 不是那麼多。
我看,以從SEH異常轉儲在C#程序的唯一方法是不抓他們 - 然後,因爲未處理的異常,請使用Application.ThreadException
處理程序來創建一個小型轉儲。另一種方法是讓CLR翻譯SEH例外成.NET異常,並抓住它(如System.AccessViolationException
) - 但是這將意味着沒有轉儲創建,信息丟失(在Exception
堆棧跟蹤信息不豐富的小型轉儲)。
那麼,如何通過創建一個小型轉儲程序和將異常轉換爲.Net異常來處理SEH異常,以便我的應用程序可以嘗試恢復?
編輯
通過「未捕獲異常」我也意味着捕捉,然後重新拋出,這確實保留了豐富的異常信息。
現在,我從來沒有考慮supressing System.Exception
或任何從System.SystemException
獲得。這意味着AccessViolation
(和朋友)總是導致程序結束併產生轉儲,而拋出的所有其他異常都需要從某個子類型派生(ApplicationException
?)。