代码之家  ›  专栏  ›  技术社区  ›  STW

.NET-密集调试的第一次例外侦听器?

  •  8
  • STW  · 技术社区  · 15 年前

    这可能是不切实际的,但是否有可能使组件在其过程中发生的所有“第一次机会”异常都得到通知?

    我们有一些第三方(由我们承包)组件,它们除了吃一些多余的东西外,什么都做不到,而且商业关系的政治使整个痛苦成为一种皇家痛苦。

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

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

    2 回复  |  直到 12 年前
        1
  •  2
  •   HugoRune    12 年前

    NET 4.0实际上添加了 AppDomain.FirstChanceException 事件。它在执行任何catch块之前激发。

    这个 MSDN article 有一些例子。

    基本上,您只需添加这样的事件处理程序:

        AppDomain.CurrentDomain.FirstChanceException += 
            (object source, FirstChanceExceptionEventArgs e) =>
            {
                Console.WriteLine("FirstChanceException event raised in {0}: {1}",
                    AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
            };
    
        2
  •  7
  •   Ben Schwehn    15 年前

    您可以使用.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...
    

    事件或类似事件。

    编辑:一个可能更好的选择是使用 unamanaged debugging API 相反。

    基本上你可以设置一个 ICorManagedCallback / ICorManagedCallback2 回调使用 ICorDebug::SetManagedHandler 并在发生异常时获取回调。

    我在这方面的经验不足,无法了解分析API的优点/缺点。

    我刚看了一下 mdgb sample 它使用ICordebug API,并且似乎从异常中获得了足够多的通知(要快速查看发生的事件,请在corapi/debugger.cs:406中的handleEvent方法中设置一个断点)

    推荐文章