2010-07-06 9 views
1

En utilisant sos, je peux obtenir la liste d'entrée de table de méthode pour une classe particulière:Comment faire correspondre une entrée de table de méthode CLR avec MethodDesc?

!DumpMT -MD 1d3c58 
PDB symbol for mscorwks.dll not loaded 
EEClass: 001d195c 
Module: 001d2f2c 
Name: Class1.B 
mdToken: 02000005 
BaseSize: 0xc 
ComponentSize: 0x0 
Number of IFaces in IFaceMap: 0 
Slots in VTable: 7 
-------------------------------------- 
MethodDesc Table 
    Entry MethodDesc  JIT Name 
691f6a90 69071248 PreJIT System.Object.ToString() 
691f6ab0 69071250 PreJIT System.Object.Equals(System.Object) 
691f6b20 69071280 PreJIT System.Object.GetHashCode() 
692674c0 690712a4 PreJIT System.Object.Finalize() 
001dc088 001d3c34  NONE Class1.B.M() 
001dc090 001d3c40  NONE Class1.B.N() 
001dc098 001d3c4c  JIT Class1.B..ctor()

Mais je ne peux pas comprendre comment sos peut correspondre à une entrée de la table avec un MethodDesc - ayant un coup de coude autour de la méthode La table en mémoire ne donne que les valeurs d'entrée, qui pointent vers le talon JIT. Je ne peux pas comprendre comment vous pouvez obtenir les MethodDesc à partir de là. Quelqu'un a des idées?

Répondre

0

Vous pouvez obtenir le MethodDesc de l'entrée pour Class1.B..ctor()

!dumpmd poi(001dc098-0x4) 

Par exemple est ici un échantillon dumpmt

0:021> !dumpmt -md poi(0x18e3d90) 
EEClass: 012ef6a4 
Module: 00d42c5c 
Name: LINQPad.UserOptions 
mdToken: 02000002 (C:\Documents and Settings\naveen\My Documents\Downloads\LINQPad.exe) 
BaseSize: 0x3c 
ComponentSize: 0x0 
Number of IFaces in IFaceMap: 0 
Slots in VTable: 16 
-------------------------------------- 
MethodDesc Table 
    Entry MethodDesc  JIT Name 
03aa6aa0 03924924 PreJIT System.Object.ToString() 
03aa6ac0 0392492c PreJIT System.Object.Equals(System.Object) 
03aa6b30 0392495c PreJIT System.Object.GetHashCode() 
03b17410 03924980 PreJIT System.Object.Finalize() 
01321618 00d481ac  JIT LINQPad.UserOptions..ctor() 
01321458 00d481c0  JIT LINQPad.UserOptions..cctor() 
013214a8 00d48140  JIT LINQPad.UserOptions.get_Instance() 
01321580 00d4814c  JIT LINQPad.UserOptions.Load() 
01321650 00d48158  JIT LINQPad.UserOptions.Deserialize(System.String) 
00d4c249 00d48164  NONE LINQPad.UserOptions.Save() 
018c8410 00d48170  JIT LINQPad.UserOptions.get_TabSizeActual() 
00d4c251 00d4817c  NONE LINQPad.UserOptions.get_IsVBDefault() 
01325ef0 00d48188  JIT LINQPad.UserOptions.GetDefaultCustomSnippetsFolder() 
01325e00 00d48194  JIT LINQPad.UserOptions.GetCustomSnippetsFolder(Boolean) 
0db83d50 00d481a0  JIT LINQPad.UserOptions.get_ActualEditorBackColor() 
01321898 00d481b4  JIT LINQPad.UserOptions.<Deserialize>b__0(System.Reflection.FieldInfo) 

Et est ici référence retour à methoddesc de entrée à l'aide! dumpmd

0:021> !dumpmd poi(01321458-0x4) 
Method Name: LINQPad.UserOptions..cctor() 
Class: 012ef6a4 
MethodTable: 00d4838c 
mdToken: 0600000c 
Module: 00d42c5c 
IsJitted: yes 
CodeAddr: 01321458 

HTH

+0

Je veux le faire dans un code dangereux dans son propre espace de processus, n'utilisant pas sos dans une session de débogage – thecoop

+0

Avez-vous l'intention d'héberger CLR? Je ne vous parle pas de "code dangereux et de propre espace de processus". Le CLR peut être démonté dans le débogueur. – Naveen

+0

Mon arrière-pensée est d'obtenir un type pour manipuler ses propres vtables de code dangereux. Ce qui est stocké dans les tables de méthodes de type est l'adresse du talon JIT, et je dois lier ceux jusqu'à l'adresse de la méthode (obtenue par un pointeur de méthode d'un délégué de la méthode) pointant vers, donc je peux le changer à autre chose. Je sais que c'est extrêmement diabolique, mais bon :) – thecoop

Questions connexes