Трассировка всех обработанных исключений - PullRequest
1 голос
/ 23 сентября 2010

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

bool requireUpdate = false;
try
{
    requireUpdate = !client.IsUpToDate();
}
catch{ }

Мне нужен способ получить исключение без необходимости перекомпилировать и выполнить развертывание.

Есть ли способ изменить файл app.config, чтобы он мог отследить все обработанные исключения в файле журнала, независимо от того, как они были обработаны?

Ответы [ 7 ]

1 голос
/ 24 сентября 2010

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

1 голос
/ 20 ноября 2015

Только потому, что я обнаружил это сегодня (и мне действительно нравится воскрешать старые вопросы с не слишком полезными ответами!), Начиная с .NET4, на AppDomain появляется новое событие, которое запускается перед обработкой любых исключений. *

В определенный момент в коде установки для вашего приложения (например, Program.Main, Application_OnStart и т. Д.) Вы можете добавить обработчик:

class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.FirstChanceException 
            += FirstChanceException

        // ...rest of your app startup
    }

    private static bool LogFirstChanceExceptions
    {
        get  
        {
            return ConfigurationManager.AppSettings["logFirstChanceExceptions"] 
                                       .Equals(bool.TrueString)
        }
    }

    private static void FirstChanceException(object sender,
                                             FirstChanceExceptionEventArgs e)
    {
        if (e != null && 
            e.Exception != null &&
            LogFirstChanceExceptions)
        {
            Console.Error.WriteLine("First-chance {0}: {1}",
                                    e.Exception.GetType(), 
                                    e.Exception.Message);
        }
    }
}

(не проверено, без гарантии и т. Д. Не изображено: любая обработка повторного входа, если обработчик FirstChanceException сам вызывает исключение)

Не помогает OP, но это может помочь людям, которые могут перекомпилировать, включить что-то, что позволит им переключать этот вид трассировки в будущем.

1 голос
/ 23 сентября 2010

ОБНОВЛЕНО

Профилирование CLR может помочь вам!

Посмотрите на эту ссылку: http://msdn.microsoft.com/en-us/magazine/cc301839.aspx

Вы можете отслеживать свои исключения:

"API профилирования предлагает обширный набор обратных вызовов, которые детально отображают фазы поиска, раскрутки и, наконец, фазы цикла обработки исключений. Интересный сценарий профилирования будет отслеживать управляемые исключения и предоставлять дополнительную информацию, такую ​​как поток Win32, который выдает исключение, функция, которая была на вершине стека, аргументы этой функции и локальные объекты, находившиеся в области действия в момент возникновения исключения. "

1 голос
/ 23 сентября 2010

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

Лучший способ получить их - переписать / перекомпилировать / развернуть.

0 голосов
/ 24 сентября 2010

Есть еще один вариант, но он может быть или не быть симпатичным: родинки.

Технически используемый для модульного тестирования, Крот позволяет заменять любой метод .NET делегатом . Возможно, вы сможете использовать его для замены этого метода вашим делегатом, который вместо этого делает то, что вы хотите.

Возможно, вы сможете заменить исходный метод делегатом, который вызывает client.IsUpToDate (), так что вы можете вместо этого поймать исключение?

Родинки являются частью Pex: http://research.microsoft.com/en-us/projects/pex/default.aspx

0 голосов
/ 23 сентября 2010

Трюки, которые я использовал для этого в Java:

Просмотрите все блоки catch в приложении, ища пустые.Добавьте сообщение отладки или трассировки в блок, говорящее что-то вроде: «Перехват ожидаемого исключения» и исключения.В любом случае, вы должны иметь это и установить политику, при которой автоматическое поглощение исключений абсолютно неприемлемо.

Если не удается очистить исключение, перекомпилируйте базовое исключение, добавьте блок в конструктор no-arg для регистрациитрассировка стека, если приложение находится в режиме отладки (или трассировки).Очевидно, что это проще сделать, если у вашего приложения / библиотеки есть своя собственная иерархия исключений, но есть способы внедрить это поведение (здесь способ сделать это в C # будет отличаться от того, как я это сделаю)

0 голосов
/ 23 сентября 2010

Это решение может быть тем, что вы ищете.
В основном инструкция состоит в том, чтобы использовать этот блок кода:

System.Diagnostics.EventLog.WriteEntry ("MyEventSource", исключение. StackTrace,
System.Diagnostics.EventLogEntryType.Warning);

Кроме того, app.config по той же ссылке выглядит примерно так: <system.diagnostics> <switches>

    <add name="MySwitch" value="Verbose" />
</switches>
<trace autoflush="true">
    <listeners>
        <add name="EventLogger"
             type="System.Diagnostics.EventLogTraceListener"
             initializeData="NameOfYourApplication" />
    </listeners>
</trace>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...