.NET

2010-03-25 29 views
5

'da bir dizinin başlığı nedir? Bir dizinin Windbg ve SOS eklentisiyle bellekteki temsilini biraz gördüm..NET

0:000> !clrstack -l 
OS Thread Id: 0xc3c (0) 
ESP  EIP  
0015f0cc 0043d1cf test.Program.Main(System.String[]) 
    LOCALS: 
     0x0015f0d8 = 0x018a2f58 
0:000> !do 0x018a2f58 
Name: test.myobj 
MethodTable: 0026309c 
EEClass: 00261380 
Size: 12(0xc) bytes 
(C:\Users\admin\Documents\Visual Studio 2008\Projects\test\test\bin\Debug\test.exe) 
Fields: 
     MT Field Offset     Type VT  Attr Value Name 
01324530 4000001  4  System.Int32[] 0 instance 018a2f64 tab 
0:000> dd 018a2f64 
018a2f64 01324530 00000007 00ffffff 00ffffff 
018a2f74 00ffffff 00ffffff 00ffffff 00000000 
018a2f84 00000000 00000000 00000000 00000000 

bir başlık boyutu dizinin içeren görebilirsiniz (00000007): Burada

bu C#: ana nihai kırılabilirler

class myobj{ 
    public int[] arr; 
} 
class Program{ 
    static void Main(string[] args){ 
    myobj o = new myobj(); 
    o.arr = new int[7]; 
    o.arr[0] = 0xFFFFFF; 
    o.arr[1] = 0xFFFFFF; 
    o.arr[2] = 0xFFFFFF; 
    o.arr[3] = 0xFFFFFF; 
    o.arr[4] = 0xFFFFFF; 
    } 
} 

, ve gözlemleme ama sorum şu: 01324530 değeri nedir?

Teşekkürler!

cevap

5

değeri 01.324.530 yöntem tablodur. Bu, .NET'in sanal yöntemleri nasıl uyguladığıdır - her bir yöntem bir işlevin göstericisidir.

Dizinin değeri 018a2f64 işaretçisinde olduğunu unutmayın. Görüyorum ki hafızayı dd ile terk ettin. Bilmediyseniz, diziyi şu şekilde de atabilirsiniz:

!da 018a2f64 
+0

Bir dizide ne bir işaretçi ne yapıyor? – Thomas

+0

Diziler, diğer nesneler gibi yöntemlere sahiptir. – SLaks

+0

.NET dizileri, tümü "System.Array" türetilen sınıflardır. Türetme olduğundan, aşırı yüklenmiş yöntemler için bir sanal yöntem tablosu vardır. – Blindy

0

Here, .Net 1.0'daki dizileri açıklayan mükemmel bir makaledir.

O zamandan beri ne kadar değiştiğini bilmiyorum.

0

MT bu hatta ne anlama geliyor?

 MT Field Offset     Type VT  Attr Value Name 
01324530 4000001  4  System.Int32[] 0 instance 018a2f64 tab 

Sanırım aynı şey anlamına geliyor, aynı sayı olduğu için.

(Andrey yorumuna göre bu yöntem tablo anlamına gelir.)