代码之家  ›  专栏  ›  技术社区  ›  thecoop

如何将clr方法表条目与methoddesc匹配?

  •  1
  • thecoop  · 技术社区  · 16 年前

    使用sos,我可以获得特定类的方法表条目列表:

    !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()

    但我不知道SOS如何将表条目与 MethodDesc -在内存中对方法表进行浏览只会给出指向JIT存根的条目值。我不知道你怎么能得到 方法DESC 从那里开始。有人有什么想法吗?

    1 回复  |  直到 16 年前
        1
  •  0
  •   Naveen    16 年前

    您可以从class1.b..ctor()的条目中获取methodDesc。

    !dumpmd poi(001dc098-0x4)
    

    例如,这里有一个示例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)
    

    这里是从条目using返回到methoddesc的引用!DUPMD

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

    高温高压