.NET - слушатель первого шанса исключения для интенсивной отладки? - PullRequest
8 голосов
/ 04 июня 2009

Это, вероятно, нереально, но можно ли было бы разрешить компоненту получать уведомления обо всех первых исключениях, возникающих в его процессе?

У нас есть некоторые сторонние (по контракту с нами) компоненты, которые ничего не могут сделать, кроме как потреблять исключения, а политика деловых отношений делает все испытание королевской болью.

Нам также известно, что часть нашего кода выполняет разочаровывающее действие, позволяя исключениям исчезать в пропасть, а не использовать наш централизованный регистратор исключений.

Я предполагаю, что наше приложение должно быть запущено как дочерний процесс приложения отладки для достижения эффекта, но я думаю, что стоит спросить:)

Ответы [ 2 ]

7 голосов
/ 04 июня 2009

. Вы можете использовать API профилирования .net для получения уведомлений об исключениях во всех состояниях. Доступны следующие методы:

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 неуправляемой отладки .

По сути, вы можете установить ICorManagedCallback / ICorManagedCallback2 с помощью ICorDebug :: SetManagedHandler и получать обратные вызовы при возникновении исключений.

Я недостаточно опытен в этой области, чтобы знать, какие преимущества / недостатки перед API профилирования.

Я только что посмотрел на mdgb образец , который использует API ICorDebug, и кажется, что он получает достаточно уведомлений от исключений (чтобы быстро увидеть, какие события происходят, установите точку останова в методе HandleEvent в corapi /Debugger.cs:406)

2 голосов
/ 20 февраля 2013

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);
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...