Как устранить неполадки в сообщениях об ошибках .NET 2.0 в журнале событий? - PullRequest
9 голосов
/ 02 мая 2009

Я работаю над продуктом с открытым исходным кодом под названием EVEMon , написанным на C # и предназначенным для платформы .NET 2.0, у меня есть один пользователь, который страдает от странного сбоя .NET, который мы не смогли разрешить.

Event Type: Error
Event Source: .NET Runtime 2.0 Error Reporting
Event Category: None
Event ID: 5000
Date: 4/29/2009
Time: 10:58:10 PM
User: N/A
Computer: removed this
Description:
EventType clr20r3, P1 evemon.exe, P2 1.2.7.1301, P3 49ea37c8, P4
system.windows.forms, P5 2.0.0.0, P6 4889dee7, P7 6cd3, P8 18, P9
system.argumentexception, P10 NIL.

Data:
//hex representation of the above Description

Само приложение завершает работу без отображения ошибки (несмотря на наличие интерфейса обработки ошибок), указанные выше сообщения были скопированы из журнала событий Windows. Конечный пользователь переустановил .NET и обновил до последних версий. Файлы .PDB распространяются с каждой новой версией программы, чтобы помочь в отладке и тестировании. Пользователь с рассматриваемой проблемой имеет полный комплект файлов PDB для правильной версии EVEMon.

Существует ли конкретная, проверенная и испытанная методика для анализа и диагностики этого типа аварии? и если да, какие инструменты и технологии доступны для помощи в отладке?

Особая благодарность

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

Ответы [ 8 ]

18 голосов
/ 04 июля 2009

Вот как я бы решил проблему для конечного пользователя при сбое.

  1. Загрузите и установите средства отладки для Windows на http://www.microsoft.com/whdc/devtools/debugging/default.mspx

  2. После установки инструментов (по умолчанию они переходят в C: \ Program Files \) запускают окно командной строки.

  3. Перейдите в каталог, содержащий adplus (например, «C: \ Program Files \ Средства отладки для Windows (x86)»).

  4. Запустите следующую команду. Это запустит приложение и прикрепит adplus.

adplus -crash -o C:\debug\ -FullOnFirst -sc C:\path\to\your\app.exe

После создания аварийного дампа

После сбоя приложения запустите WinDbg и загрузите файл .dmp, созданный в C: \ debug. (Файл -> Открыть аварийный дамп)

Выполните эти команды, чтобы увидеть трассировку стека и, надеюсь, найти проблему.

Чтобы загрузить SOS для отладки

  • Pre .NET 4.0
.loadby sos mscorwks
  • .NET 4.0
.loadby sos clr

Чтобы увидеть трассировку стека

!clrstack

Чтобы увидеть более полезную трассировку стека

!clrstack –p

Ткнуть внутрь объекта .. возможно, посмотрите, что вызвало исключение

!do <address>

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

0:009> !do 017f2b7c    
Name: System.String    
MethodTable: 790fd8c4    
EEClass: 790fd824    
Size: 124(0x7c) bytes    
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)    
String: \\server\path\not_here.txt
Fields:    
      MT    Field   Offset                 Type VT     Attr    Value Name    
79102290  4000096        4         System.Int32  1 instance       54 m_arrayLength    
79102290  4000097        8         System.Int32  1 instance       53 m_stringLength    
790ff328  4000098        c          System.Char  1 instance       5c m_firstChar    
790fd8c4  4000099       10        System.String  0   shared   static Empty    
    >> Domain:Value  00161df8:790d884c <<    
7912dd40  400009a       14        System.Char[]  0   shared   static WhitespaceChars    
    >> Domain:Value  00161df8:014113e8 <<
5 голосов
/ 04 июля 2009

Просмотр вашего исходного кода (транка) означает, что ваша необработанная обработка исключений кажется неполной в отношении приложений Windows Forms:

Вам необходимо обработать как исключения потока не-пользовательского интерфейса, так и исключения потока пользовательского интерфейса:

  • Для первого вам нужно реализовать обработчик необработанных исключений CLR через AppDomain.CurrentDomain.UnhandledException, который уже есть.

  • Для последнего вам необходимо реализовать обработчик необработанных исключений Windows Forms через Application.ThreadException, который, похоже, отсутствует; это действительно может привести к тем проблемам, свидетелями которых вы являетесь. Пример реализации см. В документации MSDN Application.ThreadException Event .

Обратите внимание, что прямо сейчас вы явно подавляете перехват необработанных исключений Windows Forms через Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException), вам нужно изменить это значение на UnhandledExceptionMode.CatchException, чтобы включить маршрутизацию к вашему обработчику для Application.ThreadException, как это уже правильно предложено Jehof.

3 голосов
/ 01 июля 2009

Какую ОС (Windows XP, Windows Vista и т. Д.) Использует пользователь?

Если Windows Vista пытается отключить функцию «Отчеты о проблемах и решения» (Панель управления -> Отчеты о проблемах и решения -> Изменить настройки -> Дополнительные настройки -> Отключить для моих программ, отчеты о проблемах)

Или попробуйте установить

  Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );

Это всегда будет направлять исключения в обработчик ThreadException.

2 голосов
/ 01 июля 2009

У нас были проблемы с Исключениями в Thread-Code. Если вы создали новый поток и забыли обработать исключение в методе потока, приложение просто «останавливается» - ни сообщения об ошибке, ни ничего, а только запись в журнале событий. Даже тогда UnhandledExceptionHandler не срабатывает.

Может быть, что-то вроде этого является причиной?

2 голосов
/ 30 июня 2009

В двух словах: в приложении есть необработанное исключение.

Если у вас есть доступ к аппарату (через удаленный доступ и т. Д.), Попробуйте установить Visual Studio Express и запустить приложение. Вы должны увидеть диалоговое окно, предлагающее возможность отладки приложения с новым экземпляром Visual Studio.

Возможно также, что что-то мешает правильной инициализации Windows Forms. Я видел сообщения на форуме, которые предполагают, что проблемы со шрифтами могут быть причиной этого - убедитесь, что пользователи установили шрифты, которые нужны вашему приложению, плюс обычные настройки по умолчанию, такие как MS SansSerif, Arial, Tahoma, Times и тому подобное.

И если это не удастся ... попробуйте принести в жертву курицу на ПК. Работает заклинание каждый раз!

1 голос
/ 03 июля 2009

... если вы можете связаться с этим страдающим пользователем, вот

Идея: этапы предварительного ведения журнала

Вместо создания ярлыка для вашего program.exe, создайте ярлык для program.bat, который будет

echo "Pre-start" > stage.txt
start program.exe

Поэтому первая строка Program.cs будет

File.WriteAllLines("stage.txt", "Program execution started.");

В обработчике AppDomain.UnhandledException первая строка будет

File.WriteAllLines("stage.txt", "Unhandled exception has been caught.");

Также убедитесь, что обработчик не выделяет память или ресурсы - предварительно выделите их при запуске программ. Обработчик только инициирует запись в журнал.

Комментарии

Весьма вероятно, что stage.txt (отправленный пользователем) будет содержать «Предварительный запуск». Это происходит, когда исключение выдается в стороннем .dll - даже до запуска вашей программы.

В этом случае вам понадобится простая программа проверки, которая не будет ссылаться на сборки, которые вы program.exe делаете, а будет Assembly.Load(...) их.

приписка

stage.txt должен быть помещен где-то в% APPDATA%, а не в Program Files.

Я нашел интересный случай на Server 2003 и еще одно приятное обсуждение .

0 голосов
/ 02 июля 2009

Вы должны обработать AppDomain.UnhandledException в коде.

Был задан похожий вопрос . Смотрите также похожие.

0 голосов
/ 02 мая 2009

Вы должны получить более подробную трассировку стека, отправив пользователю файл .pdb для этого конкретного выпуска (который должен быть помещен рядом с .exe) и попросите его воспроизвести сбой.

...