2013-03-19 69 views
4

我有一個調用混合模式C++ dll的C#應用​​程序。我通過HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ Windows Error Reporting \ LocalDumps啓用了轉儲生成。禁用.NET本機異常處理

當dll訪問無效內存時,運行時將win32異常轉換爲受管System.AccessViolationException,並在生成轉儲之前展開堆棧,銷燬本地堆棧信息。根據msdn的說法,在.NET獲取並手動生成轉儲之前,我可以自己捕獲異常,但在已經損壞的程序上運行代碼可能會掛起它。那麼,我該如何禁用SEH翻譯呢?

回答

1

你不能禁用它。除非您發現異常,否則CLR不會解除堆棧。確保你沒有。這需要通過AppDomain.UnhandledException事件處理程序。你需要的基本功能是Marshal.GetExceptionPointers(),當你打開minidump的時候,這個功能可以查明異常。

你會在我的答案this MSDN forum threadthis pinvoke.net snippet找到資源,應該足以讓你自己拼湊在一起。

+0

謝謝你的回答,但AppDomain.UnhandledException與返回託管代碼之前捕獲異常的問題相同:進程已損壞,並且試圖在進程本身內生成轉儲可能會掛起。 – 2013-03-21 18:47:42

+0

當然,這很有可能。進程狀態可能被破壞,繼續運行代碼不再可能。例如,由於損壞的進程堆造成的崩潰會導致堆被鎖定。你需要另一個武器,用另一個進程生成minidump。無論是通過Taskmgr.exe還是像[SysInternals'ProcDump](http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx) – 2013-03-21 19:18:20

+1

這樣的實用程序,Windows錯誤報告都已配置爲在外部生成轉儲。問題在於,如果未處理異常,它會生成轉儲,但.Net處理它並銷燬上下文。 AFAIK,ProcDump也遭受這個問題。 – 2013-03-22 18:55:44