2010-11-05 58 views
1

我想了解存儲在方法表中的信息。這是我的代碼。在這個例子中,方法表中的字段是什麼意思?

class MyClass 
{ 
    private int x = 60; 
    private int y = 90; 

    public void MethodB() 
    { 
     Console.WriteLine("MethodB"); 
    } 

    public void MethodC() 
    { 
     Console.WriteLine("MethodC"); 
    } 

    public void MethodA() 
    { 
     GetHashCode(); 


     Monitor.Enter(this); 

     Console.WriteLine("Attach debugger now"); 
     Console.ReadKey(); 
    } 


    static void Main(string[] args) 
    { 
     MyClass mc = new MyClass(); 
     mc.MethodA(); 
    } 
} 

這裏是物體的外觀在內存

0:000>做0x02368a1c
名稱:ConsoleApplication1.MyClass
方法表:001f3310
EEClass:001f136c
尺寸:16(0x10),以(C:\ Download \ PresentationPrep \ TechDaysDemos \ SomeTesting \ bin \ Debug \ SomeTesting.exe)
Fields:
MT字段偏移類型VT的Attr值名稱
6d032da0 4000001 4 System.Int32 1實例60×
6d032da0 4000002 8 System.Int32 1實例90ÿ

然後我轉儲方法表

0:000 > DD 001f3310
001f3310 00000000 00000010 00050011 00000004
001f3320 6d030770 001f2f2c 001f334c 001f136c
001f3330 00000000 00000000 6cf86ab0 6cf86ad0
001f3340 6cf86b40 6cff7540 008500d0 00000080
001f3350 00000000 00000000 00000000 00000000
001f3360 00000000 00000000 00000000 00000000
001f3370 00000000 00000000 00000000 00000000
001f3380 00000000 00000000 00000000 00000000

這裏是我發現有點混亂。

  1. 第一個字段表示對象的類型(如果它的類或數組等)。我的理解是,這個字段顯示0x00040000,而這裏顯示的只是0x00000000。

  2. 第二個字段是對象的大小。這個是好的。

  3. 第三場00050011有什麼意義?

  4. 這一個表示指向父對象類方法ToString,Equals,GetashCode和Finalize的繼承方法的數量。它是否正確?

我不明白其他領域,所以如果一些人也解釋這些,它將受到高度讚賞。

回答

1

這基本上是一個實現細節,並試圖找出CLR如何通過在內部結構周圍展開工作並不容易。許多內部結構都以各種方式進行了優化,這使得難以傾倒相關信息。我有一個similar question here

如果您還沒有看過它,我建議您閱讀Shared Source CLI essentials。雖然它沒有涵蓋所有的血腥細節,但它能夠很好地解釋共享源CLI的組織方式。

根據我的經驗,如果不使用實用程序方法來封裝CLR在內部執行的操作,那麼這些結構中的某些結構就不能輕易映射。這基本上是SOS爲我們做的。如果您獲得了SSCLI的源代碼,則可以深入瞭解SOS的共享源版本的源代碼以獲取更多詳細信息。

當然,SSCLI與當前的Microsoft CLR不一樣,但根據我的經驗,它們有很多共同之處,所以它通常是很好的信息來源。

在.NET 1.x here中詳細記錄了方法表的實現方式。它有很多細節,但是實施已經改變了,所以它不適用於當前的CLR。

+0

感謝布賴恩之間切換。這些字段在高級.NET調試手冊中有描述,但由於某些原因,我得到了不同的值,本書中對此進行了描述;我希望有人能解釋可能導致差異的原因。 – imak 2010-11-05 16:42:19

1

只需使用

!sos.dumpmt 001f3310 

這會給你的方法錶轉儲,和你不必擔心內存的佈局,可以爲你的迴應版本和SP