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

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

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

Спасибо

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

Решение

  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, чтобы добавить полезное ведение журнала в ваше приложение и сбросить информацию об исключениях перед закрытием приложения.

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

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

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

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

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

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

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

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

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

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

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

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