Как определить проблему при сбое программы, не показывая ошибку?
Пожалуйста, дайте мне знать, какие шаги мне нужно выполнить, когда мое приложение аварийно завершает работу и закрывается, показывая диалоговое окно, содержащее кнопки "Не отправлять" и "Отправить отчет об ошибке".
Что я могу сделать, кроме как посмотреть на программу просмотра событий, чтобы решить эту проблему?
Спасибо
6 ответов
Вы можете добавить
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, чтобы добавить полезную регистрацию в ваше приложение и выгрузить информацию об исключениях до закрытия приложения.
Спросите своих пользователей, могут ли они воспроизвести ошибку и как. Если вы можете воспроизвести ошибку, запустите отладку в 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 для анализа.