Entschlüsseln der .NET clr20r3-Ausnahmeparameter P1..P10


79

Ich versuche, die Bedeutung der P1 ... P10-Parameter zu entschlüsseln, die mit einem verknüpft sind clr20r3, der in das Ereignisprotokoll geschrieben wird, wenn in meiner Anwendung eine Ausnahme auftritt.

Das Beste, was ich finden konnte, ist:

  • P1 : der Hosting-Prozess ( zB w3wp.exe )
  • P2 : die Hosting - Prozessversion ( zB 6.0.3790.1830 )
  • P3 : ??? ( zB 42435be1 )
  • P4 : die Anordnung aus dem die Ausnahme ausgelöst wurde ( z mrtables.webservice )
  • P5 : die Baugruppenversion ( zB 2.1.2.0 )
  • P6 : ??? ( zB 4682617f )
  • P7 : ??? ( zB 129 )
  • P8 : ??? ( zB 50 )
  • P9 : der Ausnahmetyp angehoben ( z system.argumentexception )
  • P10 : ??? ( zB NIL )

Das Googeln nach clr20r3 bietet Tausende von Beispielparameterwerten, aus denen jemand versuchen kann, ein Muster abzuleiten.

Ich hoffe jedoch auf eine Dokumentation der Parameterbedeutungen im Gegensatz zu fundierten Vermutungen.


Bearbeiten: Obwohl ich auf eine kanonische Dokumentation hoffen kann, würde ich mich wirklich freuen, wenn die Ausnahme in welcher Zeile mit einem Stack-Trace ausgelöst wird.

Bonuslesung


Antworten:


79

Hier finden Sie Informationen zu Watson Buckets

  1. Exe Dateiname
  2. Versionsnummer der Exe-Datei-Assembly
  3. Exe File Stamp
  4. Name der vollständigen Baugruppe der Exe-Datei
  5. Fehlerhafte Baugruppenversion
  6. Zeitstempel der Montage fehlerhaft
  7. Fehlerhafte Montagemethode def
  8. Fehlermethode IL Offset innerhalb der Fehlermethode
  9. Ausnahmetyp

Und auch hier ist ein MSDN- Artikel darüber.

Stichprobe:

  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

2
Hätten Sie zufällig einen Referenzlink, der den Rest der Watson-Eimer dokumentiert? Der verlinkte Artikel erwähnt nur drei von ihnen (und erwähnt sie nur beiläufig) "Zum Beispiel beschreibt Bucket P4 das fehlerhafte Modul, Bucket P9 zeigt den Typ der Ausnahme an, der nicht behandelt wurde, und Bucket P8 repräsentiert den IL-Offset, bei dem die Ausnahme auftritt wurde ursprünglich geworfen. " )
Ian Boyd

2
Ich habe ein Beispiel darüber hinzugefügt
Kiquenet

111

P7 und P8 sind wichtig, um herauszufinden, wo die P9-Ausnahme ausgelöst wurde. Verwenden Sie P4, um zu wissen, nach welcher Baugruppe gesucht werden muss. Führen Sie ildasm.exe aus und öffnen Sie diese Assembly. Datei + Speicherauszug, aktivieren Sie das Kontrollkästchen "Token-Werte", OK, und speichern Sie die .il-Datei irgendwo.

Öffnen Sie die Datei in einem Texteditor. P7 gibt Ihnen das Methoden-Token, es beginnt mit 0x06 und erzeugt den Token-Wert "06000129". Suchen nach:

.method /*06000129*/

Wenn Sie den Methodennamen erhalten, suchen Sie von dort aus nach der .class, die Ihnen den Klassennamen gibt.

P8 gibt Ihnen den IL-Offset. Suchen Sie in der gefundenen .method nach IL_0050 für die Anweisung, die die Ausnahme ausgelöst hat. Es ist etwas schwierig, es wieder Ihrem Quellcode zuzuordnen, aber Sie werden es wahrscheinlich herausfinden. Verwenden Sie gegebenenfalls einen Reflektor.

Schreiben Sie im Allgemeinen einen Ereignishandler AppDomain.UnhandledException, um die Schmerzen beim Reverse Engineering dieser Watson-Crash-Buckets zu vermeiden. Protokollieren Sie den Wert von e.ExceptionObject.ToString(), um sowohl die Ausnahmemeldung als auch eine Stapelverfolgung abzurufen.


2
Wenn die Ausnahme im Bibliothekscode auftritt, benötigen Sie wahrscheinlich sowieso die Stapelverfolgung, um herauszufinden, welcher Ihrer Codes sich auf dem Stapel befand. (Wäre schön, wenn Microsoft diesen Dialog so ändern würde, dass er besser zu .NET
passt

1
Neben der Behandlung von UnhandledException ist es auch hilfreich, direkt in Main zu versuchen / zu fangen, da das Problem manchmal auftritt, bevor der UnhandledException-Handler installiert wird.
Mark Lakata

1
Ich denke, das wird mich retten, mein Freund. Ich habe eine ASP.NET-Anwendung in meinem Schoß, die den Anwendungspool immer wieder zum Absturz bringt - und eine Fehlerliste CLR20R3mit einer Reihe dieser PWerte wird direkt um die Absturzzeit protokolliert. Es mag chaotisch sein, aber es wird mich wahrscheinlich zu einer Lösung führen, aber am Ende muss ich diesen Code ändern und eine echte Protokollierung durchführen.
Mike Perrenoud

1
Sehr nützlich +10, wenn ich könnte - in meinem Fall war es eine StackOverFlow-Ausnahme und mein Fang-Blog wurde nicht ausgeführt.
Marc

1
Im Folgenden habe ich festgestellt, dass die Funktion, auf der unser Code abstürzt, eine abstrakte virtuelle Funktion ist. Methode / * 06003452 * / public hidebysig newslot abstrakte virtuelle Instanz int32 Read ([in] [out] uint8 [] buffer, int32 offset, int32 count) cil verwaltet {} // Ende der Methode Stream :: Read
Steven Scott
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.