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

StackOverflow https://stackoverflow.com/questions/952304

Вопрос

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

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

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

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

Это было полезно?

Решение

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);
        };

Другие советы

Вы можете использовать .net profiling 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 отладки вместо этого.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top