Как устранить неполадки в сообщениях об ошибках .NET 2.0 в журнале событий?

StackOverflow https://stackoverflow.com/questions/814560

Вопрос

Я работаю над продуктом с открытым исходным кодом под названием ЭВЕМон написанный на C #, ориентированный на платформу .NET 2.0, у меня есть один пользователь, который страдает от странного сбоя .Сбой СЕТИ, который мы не смогли устранить.

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.

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

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

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

Это было полезно?

Решение

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

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

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

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

  4. Выполните следующую команду.После этого приложение запустится и подключит adplus.

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

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

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

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

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

  • Версия до .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 <<

Другие советы

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

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

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

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

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

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

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

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

  Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );

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

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

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

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

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

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

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

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

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

Вместо создания ярлыка для вашего 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.");

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

Комментарии

Весьма вероятно, что stage.txt (отправленный пользователем) будет содержать " Pre-start " ;. Это происходит, когда в сторонней организации создается исключение .dll & # 8212; даже до того, как ваша программа запустилась.

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

P.S.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top