8

这可能是不现实的,但是是否有可能使组件能够被通知其进程中发生的所有第一次机会异常?

我们有一些第三方(由我们承包)组件,除了吃异常之外什么都做不了,商业关系的政治使整个磨难成为皇家痛苦。

我们也意识到我们的一些代码正在执行令人失望的操作,让异常消失在深渊中,而不是使用我们的集中式异常记录器。

我假设我们的应用程序必须作为调试应用程序的子进程启动才能达到效果,但我认为值得一问:)

4

2 回答 2

7

您可以使用 .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 方法中设置断点)

于 2009-06-04T18:42:51.017 回答
2

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);
        };
于 2013-02-20T11:23:41.107 回答