.NET - First chance exception listener for intensive debugging?

前端 未结 2 1329
太阳男子
太阳男子 2021-01-02 12:02

This is probably unrealistic, but would it be possible to enable a component to be notified of all first chance exceptions occuring in its process?

We have some thir

相关标签:
2条回答
  • 2021-01-02 12:26

    You can use the .net profiling API to get notifications of exceptions at all sorts of states, these are the available methods:

    ExceptionThrown
    ExceptionSearchFunctionEnter
    ExceptionSearchFunctionLeave
    ExceptionSearchFilterEnter
    ExceptionSearchFilterLeave
    ExceptionSearchCatcherFound
    ExceptionOSHandlerEnter
    ExceptionOSHandlerLeave
    ExceptionUnwindFunctionEnter
    ExceptionUnwindFunctionLeave
    ExceptionUnwindFinallyEnter
    ExceptionUnwindFinallyLeave
    ExceptionCatcherEnter
    ExceptionCatcherLeave
    ExceptionCLRCatcherFound
    ExceptionCLRCatcherExecute
    

    Using the profiling api is not entirely for the faint of heart; have a look at http://msdn.microsoft.com/en-us/library/ms404386.aspx as an entry point for your research and http://msdn.microsoft.com/en-us/library/bb384687.aspx for exception handling specifically.

    I'm not aware of a simple way to do it within your managed code such as

    AppDomain.FirstChanceException += new EventHandler...
    

    event or similar.

    EDIT: A possibly better alternative is using the unamanaged debugging API instead.

    Basically you can set a ICorManagedCallback/ICorManagedCallback2 callback using ICorDebug::SetManagedHandler and get callbacks when exceptions occur.

    I'm not experienced enough in this area to know what the advantages/disadvantages are over the profiling api.

    I just had a look at the mdgb sample which uses the ICorDebug APIs and it seems to get quite enough notifications from exceptions (to quickly see what events occur, set a breakpoint in the HandleEvent method in corapi/Debugger.cs:406)

    0 讨论(0)
  • 2021-01-02 12:32

    Net 4.0 has actually added the AppDomain.FirstChanceException event. It fires before any catch block is executed.

    This MSDN article has some examples.

    Basically you just add an event handler like this:

        AppDomain.CurrentDomain.FirstChanceException += 
            (object source, FirstChanceExceptionEventArgs e) =>
            {
                Console.WriteLine("FirstChanceException event raised in {0}: {1}",
                    AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
            };
    
    0 讨论(0)
提交回复
热议问题