Rozszyfrowanie parametrów wyjątku .NET clr20r3 P1..P10

79

Próbuję rozszyfrować znaczenie parametrów P1 ... P10 związanych z, clr20r3który jest zapisywany w dzienniku zdarzeń, gdy moja aplikacja napotka wyjątek.

Najlepsze, jakie udało mi się znaleźć, to:

  • P1 : proces hostingu ( np. w3wp.exe )
  • P2 : wersja procesu hostingu ( np. 6.0.3790.1830 )
  • P3 : ??? ( np. 42435be1 )
  • P4 : zestaw, z którego został wywołany wyjątek ( np. mrtables.webservice )
  • P5 : wersja montażowa ( np. 2.1.2.0 )
  • P6 : ??? ( np. 4682617f )
  • P7 : ??? ( np. 129 )
  • P8 : ??? ( np. 50 )
  • P9 : zgłoszony typ wyjątku ( np. system.argumentexception )
  • P10 : ??? ( np. NIL )

Wyszukiwanie w Google clr20r3 dostarcza tysięcy przykładowych wartości parametrów, z których ktoś może spróbować wyprowadzić wzorzec.

Ale mam nadzieję, że uda mi się udokumentować znaczenie parametrów, w przeciwieństwie do wyuczonych domysłów.


Edycja: Chociaż mogę mieć nadzieję na dokumentację kanoniczną, naprawdę byłbym szczęśliwy, widząc wyjątek, w którym wierszu, wraz ze śladem stosu.

Czytanie bonusowe

Ian Boyd
źródło

Odpowiedzi:

81

Oto informacje na temat Watson Buckets

  1. Nazwa pliku exe
  2. Numer wersji zestawu pliku exe
  3. Stempel pliku exe
  4. Pełna nazwa pliku exe
  5. Błędna wersja zespołu
  6. Znacznik czasu zespołu powodującego błąd
  7. Wadliwa metoda montażu def
  8. Metoda błędu IL Offset w ramach metody błędu
  9. Typ wyjątku

A także tutaj jest artykuł MSDN na ten sam temat.

Próba:

  Problem Signature 01: devenv.exe
  Problem Signature 02: 11.0.50727.1
  Problem Signature 03: 5011ecaa
  Problem Signature 04: Microsoft.VisualStudio.SharePoint.Project
  Problem Signature 05: 11.0.60226.0
  Problem Signature 06: 512c2dba
  Problem Signature 07: 18a8
  Problem Signature 08: 1d
  Problem Signature 09: System.NullReferenceException
Naveen
źródło
2
Czy miałbyś odsyłacz do referencji, który dokumentuje pozostałe wiadra firmy Watson? W połączonym artykule wymieniono tylko trzy z nich (i zdarza się, że wspomina o nich tylko mimochodem ). Na przykład zasobnik P4 opisuje moduł powodujący błąd, zasobnik P9 wyświetla typ wyjątku, który nie został obsłużony, a zasobnik P8 reprezentuje przesunięcie IL, przy którym wyjątek został pierwotnie wyrzucony. ” )
Ian Boyd
2
Dodałem próbkę na ten temat
Kiquenet
111

P7 i P8 to te ważne, aby dowiedzieć się, gdzie został zgłoszony wyjątek P9. Użyj P4, aby dowiedzieć się, jakiego zespołu szukać. Uruchom ildasm.exe i otwórz ten zestaw. Plik + zrzut, zaznacz pole wyboru „Wartości tokena”, OK i zapisz gdzieś plik .il.

Otwórz plik w edytorze tekstu. P7 podaje token metody, zaczyna się od 0x06, tworząc wartość tokena „06000129”. Szukaj:

.method /*06000129*/

Co daje ci nazwę metody, poszukaj stamtąd, aby znaleźć .class, który zawiera nazwę klasy.

P8 podaje przesunięcie IL. W znalezionej metodzie poszukaj instrukcji IL_0050, która wywołała wyjątek. Mapowanie go z powrotem do kodu źródłowego jest trochę trudne, ale prawdopodobnie to zrozumiesz. W razie potrzeby użyj reflektora.

Ogólnie rzecz biorąc, napisz procedurę obsługi zdarzeń, AppDomain.UnhandledExceptionaby uniknąć bólu związanego z inżynierią wsteczną tych zasobników awaryjnych Watson. Zarejestruj wartość, e.ExceptionObject.ToString()aby uzyskać zarówno komunikat o wyjątku, jak i ślad stosu.

Hans Passant
źródło
2
Jeśli wyjątek występuje w kodzie biblioteki, prawdopodobnie i tak będziesz potrzebować śladu stosu, aby dowiedzieć się, który kod znajdował się na stosie. (Byłoby miło, gdyby Microsoft zmodyfikował to okno dialogowe, aby było ładniejsze dla .NET.)
Jason Kresowaty
1
Oprócz obsługi UnhandledException pomaga również spróbować / złapać bezpośrednio w Main, ponieważ czasami problem występuje przed zainstalowaniem programu obsługi UnhandledException.
Mark Lakata
1
Myślę, że to uratuje mnie, mojego przyjaciela. Mam aplikację ASP.NET, która spadła mi na kolana, która ciągle powoduje awarię puli aplikacji - a tuż po awarii jest rejestrowany błąd zawierający CLR20R3kilka tych Pwartości. Może to być bałagan, ale prawdopodobnie doprowadzi mnie do rozwiązania, ale w końcu będę musiał zmodyfikować ten kod i uzyskać prawdziwe logowanie.
Mike Perrenoud
1
Bardzo przydatne +10, gdybym mógł - w moim przypadku był to wyjątek StackOverFlow i mój blog catch nie został wykonany.
Marc
1
W następstwie tego stwierdziłem, że funkcja, na której nasz kod się zawiesza, jest abstrakcyjną funkcją wirtualną .. method / * 06003452 * / public hidebysig newslot abstrakcyjna instancja wirtualna int32 Read ([in] [out] uint8 [] buffer, int32 offset, int32 count) cil managed {} // koniec metody Stream :: Read
Steven Scott