Как определить проблему при сбое программы, не показывая ошибку?

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

Что я могу сделать, кроме как посмотреть на программу просмотра событий, чтобы решить эту проблему?

Спасибо

6 ответов

Решение
  1. Вы можете добавить try/catch/finally построить вокруг вашего Main() тело метода ввода.

  2. Для WinForms вы можете добавить ThreadException обработчик, непосредственно перед Application.Run(), для перехвата исключений, генерируемых обработчиками событий пользовательского интерфейса WinForms:

    Application.ThreadException +=
       new ThreadExceptionEventHandler(Application_ThreadException);
    
  3. Все остальные необработанные исключения могут быть перехвачены с помощью:

    AppDomain.CurrentDomain.UnhandledException +=
       new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    

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

  4. Visual Studio также может быть настроен для работы с исключениями первого шанса, а внешние отладчики (например, WinDbg с управляемыми расширениями SoS) также могут перехватывать исключения первого шанса ( http://www.codeproject.com/KB/debug/windbg_part1.aspx).,

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

Спросите своих пользователей, могут ли они воспроизвести ошибку и как. Если вы можете воспроизвести ошибку, запустите отладку в Visual Studio и следуйте инструкциям, чтобы вызвать сбой. Visual Studio перейдет в режим отладки, где она ловит ошибку. Форма там вы сможете следить за трассировкой стека и посмотреть, какой код вызывает ошибку. Visual studio большую часть времени делает отладку довольно простой.

В идеале вы должны использовать библиотеку журналов, такую ​​как nLog или log4net, чтобы регистрировать любые необработанные исключения и исключения в целом, регистрируя их в своем коде при их возникновении.

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

Я не использовал log4net, поэтому я не знаю, имеет ли он подобную функцию.

Ошибки "отправить / не отправить", как правило, возникают, когда у вас есть необработанное исключение в фоновом потоке (основной поток покажет, что продолжить / выйти из диалогового окна.NET с трассировкой стека).

Добавьте обработчик исключений в функцию вашего потока и войдите оттуда:

void RunMyThread()
{
    try
    {
        // background thread code
    }
    catch (Exception ex)
    {
        // Log the exception
    }
}

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

Используйте WinDBG для устранения проблемы. Вы можете отключить его (как при остановке на точке останова) при возникновении исключения, а затем проверить трассировку стека... объекты в области видимости и т. Д....

Если это происходит на сайте клиента и не может быть легко воспроизведено в отладчике разработчика, вы можете выполнить некоторую посмертную отладку. Мне нравится использовать Userdump для сбора файла дампа памяти (.DMP). Тогда я использую windbg для анализа.

Другие вопросы по тегам