【问题标题】:How can I match up a CLR method table entry with a MethodDesc?如何将 CLR 方法表条目与 MethodDesc 匹配?
【发布时间】:2010-07-06 16:33:20
【问题描述】:

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

!DumpMT -MD 1d3c58
未加载 mscorwks.dll 的 PDB 符号
EE类:001d195c
模块:001d2f2c
名称:Class1.B
mdToken:02000005
基数:0xc
组件大小:0x0
IFaceMap 中的 IFace 数量:0
VTable 中的插槽:7
--------------------------------------
方法描述表
   条目 MethodDesc JIT 名称
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 无 Class1.B.M()
001dc090 001d3c40 无 Class1.B.N()
001dc098 001d3c4c JIT Class1.B..ctor()

但我无法弄清楚 sos 如何将表条目与MethodDesc 匹配 - 在内存中的方法表周围戳一下只会给出指向 JIT 存根的条目值。我不知道如何从那里获得MethodDescs。有人有什么想法吗?

【问题讨论】:

    标签: clr internals sos


    【解决方案1】:

    您可以从 Class1.B..ctor() 的条目中获取 MethodDesc

    !dumpmd poi(001dc098-0x4)
    

    例如这里是一个示例转储

      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)
    

    这里是使用 !dumpmd 从条目返回到 methoddesc 的引用

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

    HTH

    【讨论】:

    • 我想在它自己的进程空间中使用不安全的代码,而不是在调试会话中使用 sos
    • 您打算托管 CLR 吗?我不知道“不安全的代码和自己的进程空间”。 CLR 可以在调试器中反汇编。
    • 我别有用心的目的是让一个类型从不安全的代码中操作它自己的 vtables。类型方法表中存储的是 JIT 存根的地址,我需要将它们链接到方法的地址(通过方法的委托的方法指针获得)指向,所以我可以更改它到别的东西。我知道这是非常邪恶的,但是嘿:)
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2018-10-17
    • 2016-07-23
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多