2010-04-26 25 views
3

我試圖使用類似於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?)。

回答

1

我發現,Vectored Exception Handling我可以得到任何SEH異常的第一次機會的通知,並利用這個機會製造一個小型轉儲。