.NET - 第一次有机会进行密集调试的异常侦听器?
-
11-09-2019 - |
题
这可能不现实,但是是否有可能使组件能够收到其进程中发生的所有首次机会异常的通知?
我们有一些第三方(由我们承包)组件,它们除了吃例外之外什么也做不了,而业务关系的政治使整个考验变得非常痛苦。
我们还意识到,我们的一些代码正在执行令人失望的操作,让异常消失在深渊中,而不是使用我们的集中式异常记录器。
我认为我们的应用程序必须作为调试应用程序的子进程启动才能达到效果,但我认为这是值得问的:)
解决方案
净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
使用分析 API 并不完全适合胆小的人。看一下 http://msdn.microsoft.com/en-us/library/ms404386.aspx 作为您研究的切入点 http://msdn.microsoft.com/en-us/library/bb384687.aspx 专门用于异常处理。
我不知道在托管代码中执行此操作的简单方法,例如
AppDomain.FirstChanceException += new EventHandler...
事件或类似事件。
编辑:一个可能更好的选择是使用 非托管调试 API 反而。
基本上你可以设置一个 ICor管理回调/ICorManagedCallback2 回调使用 ICorDebug::SetManagedHandler 并在发生异常时获取回调。
我在这方面没有足够的经验,不知道与分析 API 相比的优点/缺点是什么。
我刚刚看了一眼 千年发展目标样本 它使用 ICorDebug API,并且似乎从异常中获得了足够的通知(要快速查看发生了哪些事件,请在 corapi/Debugger.cs:406 中的 HandleEvent 方法中设置断点)