c # отладка сбоя windows - PullRequest
       1

c # отладка сбоя windows

0 голосов
/ 22 октября 2010

У меня есть приложение, и после примерно 20 минут простоя программа просто вылетает.(«Windows обнаружила ошибку и должна закрыться ...»)

Я понятия не имею, почему это происходит.Каков наилучший способ отладки чего-то подобного?

1 Ответ

3 голосов
/ 22 октября 2010

Обычно сбои в приложениях .Net вызваны необработанным исключением - то есть исключением в потоке в этом приложении, которое не было перехвачено в каком-то блоке try-catch :

try
{
    // Some code that may throw an exception
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}

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

Обычно это можно сделать двумя способами:

1.Убедитесь, что код для каждого потока вашего приложения содержится в блоке try-catch.

Это самый простой метод - если ваше приложение не имеет нескольких пользовательских потоков (вы будете знать, есть ли оно),это просто требует, чтобы вы поместили блок try-catch вокруг точки входа вашего приложения, например, в приложении Windows Forms:

// Probably found somewhere in Program.cs
[STAThread]
static void Main()
{
    try
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

Если вы работаете с консольным приложением, вам нужно будет использоватьчто-то отличное от MessageBox (см. первый пример).

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

2.Обработайте событие UnhandledException текущего домена приложения

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

Пример:

static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    // The rest of your application
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Console.WriteLine(e.ExceptionObject.ToString());
}

Конечно, стоит указать, что ошибка все еще может не быть пойман ни одним из двух вышеупомянутых методов (что возможно, если ошибка вызвана собственным модулем, загруженным в тот же процесс), однако это, вероятно, должно сработать.

Наконец - удачи!

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