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> !do 0x02368a1c   
Name: ConsoleApplication1.MyClass  
MethodTable: 001f3310  
EEClass: 001f136c  
Size: 16(0x10) bytes  
 (C:\Download\PresentationPrep\TechDaysDemos\SomeTesting\bin\Debug\SomeTesting.exe)  
Fields:  
      MT    Field   Offset                 Type VT     Attr    Value Name  
6d032da0  4000001        4         System.Int32  1 instance       60 x  
6d032da0  4000002        8         System.Int32  1 instance       90 y  

次に、メソッドテーブルをダンプします

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. 2 番目のフィールドは、オブジェクトのサイズです。これは大丈夫です。

  3. 3 番目のフィールドの意味は何00050011ですか?

  4. これは、継承されたメソッドの数を示し、親オブジェクト クラスのメソッドToStringEqualsGetHashCodeおよびを指しますFinalize。これは正しいです?

私は他の分野を理解していないので、それらについても説明していただければ幸いです。

4

2 に答える 2

1

使うだけ

!sos.dumpmt 001f3310

これにより、メソッド テーブル ダンプが得られるため、バージョンと SP の間で変更される可能性がある内部メモリ レイアウトについて心配する必要はありません。

于 2010-11-20T19:56:17.637 に答える
1

これは基本的に実装の詳細であり、内部構造を調べて CLR がどのように機能するかを理解しようとすることは、控えめに言っても簡単ではありません。内部構造の多くはさまざまな方法で最適化されているため、関連情報のダンプが難しくなっています。ここに同様の質問があります

まだ読んでいない場合は、Shared Source CLI Essentialsを読むことをお勧めします。すべての面倒な詳細をカバーしているわけではありませんが、共有ソース CLI がどのように構成されているかについてかなりよく説明されています。

私の経験では、これらの構造の一部は、CLR が内部で行っていることをカプセル化するユーティリティ メソッドを使用しないと簡単にマップできません。それが基本的にSOSが私たちのために行うことです。SSCLIのソースを取得した場合は、SOS の共有ソース バージョンのソースを調べて、詳細を確認できます。

もちろん、SSCLI は現在の Microsoft CLR と同じではありませんが、私の経験では多くの共通点があるため、通常は優れた情報源です。

メソッド テーブルが .NET 1.x でどのように実装されたかについての詳細な記事がここにあります。多くの詳細がありますが、残念ながら実装が変更されたため、現在の CLR では有効ではありません。

于 2010-11-05T07:56:18.197 に答える