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.
8 answers
W ten sposób rozwiązałbym problem Użytkownika Końcowego z awarią.
Pobierz i zainstaluj narzędzia debugowania dla systemu Windows na stronie http://www.microsoft.com/whdc/devtools/debugging/default.mspx
Po zainstalowaniu narzędzi (kończą się one C:\Program Files\ domyślnie) Uruchom okno wiersza poleceń.
Zmiana katalogu zawierającego adplus (np. "C:\Program Files\narzędzia debugowania dla Windows (x86)").
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 <<
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.
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.
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!
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.
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 .
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ę.
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ż
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