.NET - 密集調試的第一次機會異常偵聽器?
這可能是不現實的,但是是否有可能使組件能夠被通知其程序中發生的所有第一次機會異常?
我們有一些第三方(由我們承包)組件,除了吃異常之外什麼都做不了,商業關係的政治使整個磨難成為皇家痛苦。
我們也意識到我們的一些程式碼正在執行令人失望的操作,讓異常消失在深淵中,而不是使用我們的集中式異常記錄器。
我假設我們的應用程序必須作為調試應用程序的子程序啟動才能達到效果,但我認為值得一問:)
Net 4.0 實際上已經添加了該
AppDomain.FirstChanceException事件。它在執行任何 catch 塊之前觸發。這篇MSDN 文章有一些範例。
基本上你只需像這樣添加一個事件處理程序:
AppDomain.CurrentDomain.FirstChanceException += (object source, FirstChanceExceptionEventArgs e) => { Console.WriteLine("FirstChanceException event raised in {0}: {1}", AppDomain.CurrentDomain.FriendlyName, e.Exception.Message); };
您可以使用 .net 分析 API 來獲取各種狀態下的異常通知,這些是可用的方法:
ExceptionThrown ExceptionSearchFunctionEnter ExceptionSearchFunctionLeave ExceptionSearchFilterEnter ExceptionSearchFilterLeave ExceptionSearchCatcherFound ExceptionOSHandlerEnter ExceptionOSHandlerLeave ExceptionUnwindFunctionEnter ExceptionUnwindFunctionLeave ExceptionUnwindFinallyEnter ExceptionUnwindFinallyLeave ExceptionCatcherEnter ExceptionCatcherLeave ExceptionCLRCatcherFound ExceptionCLRCatcherExecute使用 profiling api 並不完全適合膽小的人。看看http://msdn.microsoft.com/en-us/library/ms404386.aspx>作為您研究的入口點和<http://msdn.microsoft.com/en-us/library/bb384687.aspx專門用於異常處理。
我不知道在您的託管程式碼中執行此操作的簡單方法,例如
AppDomain.FirstChanceException += new EventHandler...事件或類似事件。
編輯:一個可能更好的選擇是使用非託管調試 API。
基本上,您可以使用ICorDebug::SetManagedHandler設置ICorManagedCallback / ICorManagedCallback2回調,並在發生異常時獲取回調。
我在這方面沒有足夠的經驗來了解分析 api 的優點/缺點。
我剛剛查看了使用 ICorDebug API 的mdgb 範例,它似乎從異常中獲得了足夠多的通知(要快速查看發生了什麼事件,請在 corapi/Debugger.cs:406 中的 HandleEvent 方法中設置斷點)