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

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

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

Спасибо

Ответы [ 6 ]

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

2 голосов
/ 28 апреля 2009

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

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

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

2 голосов
/ 28 апреля 2009

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

1 голос
/ 28 апреля 2009

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

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

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

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

0 голосов
/ 28 апреля 2009

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

0 голосов
/ 28 апреля 2009

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

...