Проверьте, что вылетает из моего приложения - PullRequest
0 голосов
/ 12 марта 2012

У меня есть приложение, написанное на C # / .NET 4 / VS C # Express. Во время сеанса отладки (этого не произошло со сборкой релиза, но я не могу точно сказать, что этого не произойдет в будущем) мое приложение завершает работу без каких-либо исключений. Единственный фрагмент в моем коде, закрывающий основную форму, доступен только через меню File / Exit и обработчик события Clicked. Так что это должен быть какой-то ... «исключительный код». Как определить, какой фрагмент кода убил мое приложение?


Решение, если кто-то хотел бы использовать его:

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler( currentDomain_UnhandledException );

Обработчик событий с ведением журнала файлов

void currentDomain_UnhandledException( object sender, UnhandledExceptionEventArgs e ) {
    using ( FileStream file = new FileStream( Application.StartupPath + "\\errorlog.txt",
        FileMode.Append, FileAccess.Write ) ) {
        StreamWriter streamWriter = new StreamWriter( file );
        streamWriter.WriteLine( "-------------------------------------------------" );
        streamWriter.WriteLine( "---------- " + System.DateTime.Now + " ---------" );
        streamWriter.WriteLine( "-------------------------------------------------" );
        streamWriter.WriteLine( "Terminating: " + e.IsTerminating );
        Exception ex = (Exception)e.ExceptionObject;
        while ( ex != null ) {
            streamWriter.WriteLine( "--------- Exception: ---------- " );
            streamWriter.WriteLine( ex.GetType() );
            streamWriter.WriteLine( ex.Message );
            streamWriter.WriteLine( ex.HelpLink );
            streamWriter.WriteLine( ex.Source );
            streamWriter.WriteLine( ex.StackTrace );
            ex = ex.InnerException;
        }
        streamWriter.WriteLine();
        streamWriter.Close();
        MessageBox.Show( ( (Exception)e.ExceptionObject ).Message );
    }
}

Ответы [ 6 ]

2 голосов
/ 12 марта 2012

Прежде всего, вы должны обрабатывать исключения вокруг всего вашего кода.

Если это все еще происходит, вы можете присоединить обработчик события к событию AppDomain.UnhandledException

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

2 голосов
/ 12 марта 2012

Я бы обработал это событие Исключение необработанного домена приложения и записал бы исключение в какой-нибудь файл, чтобы посмотреть, что это за исключение.

0 голосов
/ 12 марта 2012

Все сбои приложения .net оставляют сообщение в журнале событий Windows. Начните поиск оттуда. Из того, что вы описали, это либо выход из приложения, либо сбой.

Раньше где-то в панели управления -> Система -> Дополнительно была настройка отладки, но я не могу найти ее на этом компьютере. Если включено, каждый сбой приложения будет вызывать всплывающее окно, если вы хотите отладить приложение или нет. Может быть хорошим началом.

0 голосов
/ 12 марта 2012

Установите точку останова в начале вашего метода main (), щелкнув поле или щелкнув правой кнопкой мыши в коде и выбрав Вставить точку останова.

Затем начните отладку (F5). Затем используйте функцию «Перешагнуть» (F10) и «Переступить в» (F11), чтобы построчно пролистывать / перебирать код, пока не найдете проблемный код.

0 голосов
/ 12 марта 2012

Вы убедились, что выброшенные исключения, а также необработанные исключения проверены в диалоговом окне Отладка-> Исключения?

0 голосов
/ 12 марта 2012

Попробуйте поставить точки отладки на главном конструкторе и нажимайте F10 / F11 и т. Д., Пока не будете точно знать, где находится приложение.

Если это не поможет, вы можете попробовать F10, чтобы начать отладку приложения с самого начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...