Ошибка clr20r3 .NET Windows Application Visual Studio 2010 - PullRequest
1 голос
/ 29 июля 2011

У нас есть Windows-приложение на основе .NET, разработанное с помощью Visual Studio 2010. Это приложение создано с целевой платформой .NET Framework 2.0. Мы отправляем приложение с .NET 3.5 SP1 в качестве рабочей платформы (обязательное условие). В целом, это приложение работает очень хорошо с большинством наших клиентов. Но у одного из них есть проблема в данный момент. Время от времени (периодически) приложение сталкивается с фатальной ошибкой и вынуждено завершать работу, не выбрасывая никаких сообщений об ошибках, кроме «Приложение столкнулось с проблемой и нуждается в закрытии. Приносим извинения за неудобства». Единственная информация, которую мы можем получить, из окна просмотра событий Windows. Детали ошибки следующие:

Источник: .NET Runtime 2.0 Ошибка
Тип события: clr20r3,
P1: App.exe
P2: 6.0.0.0
P3: 4dee1ecd
P4: system.windows.forms
P5: 2.0.0.0
P6: 4889dee7
P7: 16cf
P8: 159
P9: system.componentmodel.win32
P10: ноль

При сбое приложения пользователь выполнял разные операции. Мы настроили виртуальную машину с Windows XP Professional, которая является операционной системой, которую использует наш клиент. Все отлично работало в среде тестирования. Мы никогда не сможем повторить эту проблему.

У какого-нибудь тела есть идеи или мысли?

Любые комментарии высоко ценятся.

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Не полагайтесь на журнал Windows. вместо этого исправьте ошибку; Вы можете обработать любые исключения, выданные вашим приложением, зарегистрировать его, а затем перезапустить приложение:
Итак, на вашем главном:

AppDomain.CurrentDomain.UnhandledException += OnCurrentDomain_UnhandledException;

//Add these too if you are in windows forms application
Application.ThreadException += OnApplication_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

Тогда, если сгенерировано исключение, просто зарегистрируйте его, и вы также можете перезапустить приложение

private static void OnCurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
#if DEBUG
    System.Diagnostics.Debugger.Break();//we will break here if we are in debug mode.
#endif//DEBUG

    LogException(e);//maybe send email to you also.
    RestartTheApplication();    
}
2 голосов
/ 29 июля 2011

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

[STAThread]
static void Main()
{
    try
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    catch (Exception ex)
    {
        // Log me
    }
}

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

...