Как определить проблему при сбое программы без отображения ошибки?
-
18-09-2019 - |
Вопрос
Пожалуйста, дайте мне знать, какие шаги мне нужно выполнить, когда мое приложение выйдет из строя и закроется, показывая диалоговое окно, содержащее кнопки "Не отправлять" и "Отправить отчет об ошибке".
Что я могу сделать, кроме просмотра программы просмотра событий, чтобы решить эту проблему?
Спасибо
Решение
Вы могли бы добавить
try/catch/finally
постройте вокруг своегоMain()
тело метода ввода.Для WinForms вы можете добавить
ThreadException
обработчик, непосредственно перед Application.Run(), для перехвата исключений, генерируемых в обработчиках событий пользовательского интерфейса WinForms:Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
Все остальные необработанные исключения могут быть перехвачены с помощью:
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Но стоит упомянуть, что это позволяет вам регистрировать / сообщать только об исключении - вы не можете предотвратить закрытие приложения после выхода из этого окончательного обработчика.
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 для анализа.