Die Methode Get-name von Delegierten mit WinDbg
Ich hab folgenden dump der delegate-Objekt:
Name: MyEventHandler
MethodTable: 132648fc
EEClass: 1319e2b4
Size: 32(0x20) bytes
Fields:
MT Field Offset Type VT Attr Value Name
790fd0f0 40000ff 4 System.Object 0 instance 014037a4 _target
7910ebc8 4000100 8 ...ection.MethodBase 0 instance 00000000 _methodBase
791016bc 4000101 c System.IntPtr 1 instance 2ef38748 _methodPtr
791016bc 4000102 10 System.IntPtr 1 instance 0 _methodPtrAux
790fd0f0 400010c 14 System.Object 0 instance 00000000 _invocationList
791016bc 400010d 18 System.IntPtr 1 instance 0 _invocationCount
Wie bekomme ich den Namen der Methode, wies von der Stellvertretung?
InformationsquelleAutor Tsvetko | 2010-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meiner Erfahrung der Vorschlag angeboten von hakan nicht funktioniert. Hier ist, was ich Tue.
Die Ausgabe zeigt, dass das angeschlossene handler ist ein Mitglied von das Objekt verweist
_target
. Von dumping, werden Sie erhalten es ist die Methode table.Ich habe gebaut ein ähnliches Beispiel, um zu veranschaulichen:
In diesem Fall werde ich schauen das Objekt an
02842d20
.Also der Zieltyp
app.Foo
. Lassen Sie uns einen dump der Methoden für diesen Typ.Vergleichen Sie die Werte der
MethodDesc
Tabelle mit dem ursprünglichen Wert von_methodPtr
. Keine erkennbare übereinstimmung._methodPtr Punkte, um ein Stück code, das entweder funktioniert ein
jmp
um die Adresse der Funktion in Frage oder fordert ein fix-up-routine, so dass der nächste Schritt ist die Verwendung der!u
Befehl auf den Wert der_methodPtr
. Wenn wir sehen, einjmp
Unterricht haben wir die Adresse und durch die Verwendung!u
auf die Methode.Wenn auf der anderen Seite sehen wir eine
call
zuclr!PrecodeFixupThunk
können wir die MethodDesc durch das einbringen der Speicher verweist_methodPtr
wie diesesehen wir etwas, das aussieht wie eine Methode Tabelle Eintrag in das Dritte DWORD. Durch den Vergleich der Wert
002c30a8
mit der Methode Tabelle oben, sehen wir, dass der name der Methode istapp.Foo.Bar
.Da dies ein konstruiertes Beispiel, ich weiß, dass ich gefunden habe, die Methode, die ich suchte, in diesem Fall.
Eigentlich kann es etwas komplizierter, dass das obige Beispiel zeigt, wie die Felder werden unterschiedlich verwendet, abhängig von der tatsächlichen Verwendung der Veranstaltung. Allerdings, meiner Erfahrung nach ist der Ansatz oben wird die Arbeit im Allgemeinen Verleger/Abonnent-Szenario.
Für mehr details auf die details der Implementierung, die Datei Auschecken
comdelegate.cpp
des shared-source-CLI.Sieht schlecht aus auf x64, nur ein Sprung zu registrieren
InformationsquelleAutor Brian Rasmussen
Ich glaube, Sie verwenden können !ip2md auf den Wert der methodPtr. Dass sollte die Methode der Beschreibung.
Ihr seid wahrscheinlich Recht, schnelles googeln zeigte, dass dies möglicherweise nicht funktionieren, wenn die Methode nicht JITted noch. Aber ich würde trotzdem zunächst versuchen, diese und wenn es nicht funktioniert, andere Ansätze. Brian Lösung, die dumping-Methoden der Ziel-Objekt, sieht sehr bequem eigentlich.
InformationsquelleAutor hakan
Eine weitere Möglichkeit ist das zerlegen der Daten in _methodPtr.
Können sagen, unsere EventHandler sieht wie folgt aus:
Schauen wir uns die Demontage der d955840
Sehen wir einen mov zu 7A0F884 hier, so könnte dies die Methode, die wir suchen:
bingo!
Gibt es verschiedene Möglichkeiten, um den Namen der Methode, und nicht alle funktionieren in allen Situationen
InformationsquelleAutor sloth
Habe ich creatd ein littel Windbg-script zum beheben des gespeicherten Methode direkt von einem methodPtr Wert. Lesen Sie mehr über hier.
Dem Skript ist:
Speichern es in einer Datei und führen Sie es mit der _methodPtr Wert Ihrer Stellvertretung ein, wie
Sollte den trick tun auf allen Plattformen und für .NET 2.0 bis .NET 4.5.
Wie hast Du den trick mit magic pointer-Arithmetik?
Durch den Blick auf den erzeugten assembler-code. Es ist so einfach wie das. Ich könnte beachten Sie, dass es eigentlich zwei Delegierte Arten von anrufen. Action, Func, ... sind schnell. Aber "alt" stlye delgates, die Sie ausdrücklich erklären, gehen in sehr unterschiedliche code-Pfad (z.B. MethodInvoker für WndProc Delegierten) ist eine Recht häufige.
Danke! Sehr interessant
InformationsquelleAutor Alois Kraus
Mit Hilfe von ClrMd, ich arbeite an einer tool zu erkunden .Netz-dump-Datei mit einer benutzerfreundlichen GUI.
Es ist ein feature zu finden Delegierten und anzeigen der Aufruf-Liste und Methode Namen.
InformationsquelleAutor FreMag