Jak troubleshoot.NET 2.0 Komunikaty o błędach w dzienniku zdarzeń?

Pracuję nad produktem open source o nazwie EVEMon napisanym w C#, kierującym się platformą.NET 2.0, mam jednego użytkownika, który cierpi na dziwną awarię. NET, której nie byliśmy w stanie rozwiązać.

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

Sama aplikacja zawiesza się, wyświetlając błąd (pomimo błędu obsługi interfejsu użytkownika), powyższe komunikaty zostały skopiowane z dziennika zdarzeń systemu Windows. Użytkownik końcowy ponownie zainstalował. NET i zaktualizował go do najnowszych wersji. The .Pliki PDB są dystrybuowane z każdym wydanie wersji programu, aby pomóc w debugowaniu i testowaniu, użytkownik z danym problemem ma pełne uzupełnienie plików PDB dla prawidłowej wersji EVEMon.

Czy istnieje konkretna, sprawdzona technika analizy i diagnozowania tego typu awarii? a jeśli tak, jakie narzędzia i technologie są dostępne, aby pomóc w debugowaniu?

Specjalne Podziękowania

Chciałbym szczególnie podziękować Steffen Opel i podkreślić, że jego odpowiedź podczas gdy nie bezpośrednio odpowiadając na pytanie, które zadałem, rozwiązałem większy problem z moją bazą kodu, że globalna obsługa błędów brakowało ważnego komponentu.

Author: Community, 2009-05-02

8 answers

W ten sposób rozwiązałbym problem Użytkownika Końcowego z awarią.

  1. Pobierz i zainstaluj narzędzia debugowania dla systemu Windows na stronie http://www.microsoft.com/whdc/devtools/debugging/default.mspx

  2. Po zainstalowaniu narzędzi (kończą się one C:\Program Files\ domyślnie) Uruchom okno wiersza poleceń.

  3. Zmiana katalogu zawierającego adplus (np. "C:\Program Files\narzędzia debugowania dla Windows (x86)").

  4. Uruchom komendę follwing. Spowoduje to uruchomienie aplikacji i dołączenie adplus.

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

Po utworzeniu zrzutu awaryjnego

Po awarii aplikacji uruchom WinDbg i załaduj .plik DMP, który jest tworzony w C:\debug. (Plik --> Otwórz Zrzut Awarii)

Wykonaj te polecenia, aby zobaczyć ślad stosu i miejmy nadzieję znaleźć problem.

Aby załadować SOS do debugowania

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

Aby zobaczyć ślad stosu

!clrstack

Aby zobaczyć bardziej użyteczny ślad stosu

!clrstack –p

Do szturchnięcia wewnątrz obiektu..być może Zobacz, co spowodowało wyjątek

!do <address>

Np. jest to wynik aplikacji, która wylosowała się losowo z wyjątkiem IO. WinDbg wskazał ścieżkę, do której się odwołano, która była nieprawidłowa.

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 <<
 18
Author: Michael Baker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-11 07:17:36

Zaglądanie do kodu źródłowego (trunk) wskazuje, że nieobsługiwana obsługa wyjątków wydaje się być niekompletna w odniesieniu do aplikacji Windows Forms:

Musisz obsługiwać zarówno wyjątki nie-UI wątku i wyjątki UI wątku:

  • Dla tego pierwszego musisz zaimplementować CLR unhandled exception handler poprzez AppDomain.CurrentDomain.UnhandledException, który jest już na miejscu.

  • Dla tego ostatniego musisz zaimplementować obsługę wyjątków Windows Forms bez obsługi za pomocą Application.ThreadException, które wydaje się brakować; to rzeczywiście może przynieść dokładnie te problemy, których jesteście świadkami. Przykład implementacji znajduje się w dokumentacji MSDN aplikacji.Threadexception Event .

Zauważ, że w tej chwili wyraźnie eliminujesz wyłapywanie nieobsługiwanych wyjątków Windows Forms za pomocą Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException) ,musisz zmienić to na UnhandledExceptionMode.CatchException, aby włączyć routing do obsługi dla Application.ThreadException, zgodnie z poprawną sugestią Jehof.

 5
Author: Steffen Opel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-04 13:55:48

Jaki system operacyjny (Windows XP, Windows Vista itp.) czy użytkownik korzysta?

Jeśli System Windows Vista spróbuje wyłączyć funkcję "raporty i rozwiązania problemów" (Panel sterowania-->raporty i rozwiązania problemów-->Zmień Ustawienia-->Ustawienia zaawansowane-->wyłącz dla moich programów, raportowanie problemów)

Lub spróbuj ustawić

  Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );

Spowoduje to zawsze przekierowanie WYJĄTKÓW do procedury obsługi wątku.

 3
Author: Jehof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 08:54:08

W skrócie: w aplikacji znajduje się nieobsługiwany wyjątek.

Jeśli masz dostęp do maszyny (poprzez zdalny dostęp, itp.), spróbuj zainstalować Visual Studio Express i uruchomić aplikację. Powinieneś zobaczyć okno dialogowe oferujące możliwość debugowania aplikacji z nową instancją Visual Studio.

Może być też tak, że jest coś, co uniemożliwia prawidłowe inicjowanie formularzy Windows. Widziałem posty na forum, które sugerują, że problemy z czcionką mogą powodować -- upewnij się, że użytkownicy mają zainstalowane czcionki, których potrzebuje Twoja aplikacja, oraz zwykłe domyślne, takie jak MS SansSerif, Arial, Tahoma, Times i tym podobne.

I jej brak... spróbuj poświęcić kurczaka na PC. Działa urok za każdym razem!

 2
Author: Jeremy McGee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-30 15:16:01

Mieliśmy problemy z wyjątkami w kodzie wątku. Jeśli pojawi się nowy wątek i zapomnisz obsłużyć wyjątek w metodzie thread, aplikacja po prostu "zatrzymuje się" - brak Komunikatu o błędzie, nic, ale tylko wpis w dzienniku zdarzeń. Nawet wtedy UnhandledExceptionHandler nie jest wyzwalane.

Może coś takiego jest przyczyną?
 2
Author: Thorsten Dittmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 07:51:48

...jeśli jesteś w stanie skontaktować się z tym cierpiącym użytkownikiem, oto

Idea: log Pre-execution stages

Zamiast tworzyć skrót do program.exe, Zrób skrót do program.bat, co spowoduje

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

Pierwszy wiersz Program.cs będzie zatem

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

W funkcji obsługi AppDomain.UnhandledException pierwsza linia będzie

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

Upewnij się również, że obsługa nie przydziela pamięci ani zasobów-wstępnie przydziel je podczas uruchamiania programów. Handler uruchamia tylko zapis do dziennik.

Komentarze

Jest bardzo prawdopodobne, że stage.txt (wysłany przez użytkownika) będzie zawierał "Pre-start". Dzieje się tak, gdy wyjątek jest wyrzucany w 3rd party .dll - jeszcze przed uruchomieniem programu.

W takim przypadku będziesz potrzebował prostego programu sprawdzającego, który nie będzie odwoływał się do zestawów, które wykonujesz program.exe, ale będzie je wykonywał Assembly.Load(...).

P. S.

stage.txt powinien być umieszczony gdzieś pod %APPDATA%, a nie w plikach programu.

Znalazłem Ciekawy przypadek na serwerze 2003 i kolejna miła dyskusja .

 1
Author: bohdan_trotsenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 20:09:35

Powinieneś uzyskać bardziej szczegółowy ślad stosu, wysyłając plik .pdb dla tego konkretnego wydania do użytkownika (do umieszczenia obok .exe) i każąc mu odtworzyć awarię.

 0
Author: Sören Kuklau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-02 10:05:17

Powinieneś obsługiwać AppDomain.UnhandledException kodem.

Zadano podobne pytanie . Zobacz też

 0
Author: bohdan_trotsenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:45:36