2013-02-08 38 views
2

我有一個從本機C++(如XYZ.dll)創建的DLL。我使用C++ .NET的包裝器鏈接該DLL。此封裝器的一個對象用於我的最高級C#代碼。如何捕捉C#AppCrash,因爲本機C++ DLL失敗

我的問題是:有時我的DLL中的函數崩潰,我的最高級C#代碼與AppCrash崩潰;崩潰模塊:XYZ.dll。我正試圖弄清楚我們的原生C++代碼在哪裏崩潰,但是這被證明是徒勞的。我想知道是否有一種方法可以讓我在C#代碼中捕捉到這個崩潰並繼續前進。

+0

盡我所知你不能抓住它。即使你將它拆分爲IL並修改IL表示。 – bash0r

+0

調試非託管代碼時,通常最好回到舊式經過時間考驗的技術,如日誌記錄。您不會從非託管的「崩潰」中獲得託管的異常,因此您可以做的最好的做法是隔離導致崩潰的原因並避免這種情況發生。即使事實證明您是無法控制的第三方代碼中的錯誤,您至少可以找到適當的解決方法。 –

+0

這是不正確的。你可以在c#中使用SEH。 http://limbioliong.wordpress.com/2011/10/13/using-structured-exception-handling-to-handle-exceptions-from-c-in-c/ – thang

回答

1

我不認爲這是你正在尋找的答案,但至少它會幫助解決問題。檢查AppDomain.UnhandledException ...你應該能夠捕獲並記錄堆棧跟蹤。

+0

知道了!謝謝。 – trycatch22

0

這是你在Visual Studio中調試的東西嗎?如果沒有,請考慮安裝Windows調試器並在cdb.exe下運行您的應用程序。確保你的非託管組件具有符號(.pdb)。如果您在調試器(即Visual Studio或cdb/windbg)下運行您的應用程序,並且可以重新編譯崩潰,那麼您應該能夠獲得堆棧跟蹤。既然你暗示你擁有非託管圖書館,我可以假設你有來源?如果您在VS中,請確保禁用「只調試我的代碼」設置。如果你在windbg中,那麼一旦你遇到第一次機會異常,崩潰點應該會顯示你的堆棧跟蹤。

0

你絕對可以「趕上」這次崩潰。

在您的C++ .NET包裝器/處理程序中,將所有調用包裝到第三方DLL中,用C++ try/catch塊包裝所有調用。這應該不僅僅是可能的。

如果沒有,切換到使用Windows結構化異常處理。這將捕獲本地Win32異常並殺死它們。你可以在這個here找到Win32文檔。