2010-03-25 8 views
5

Ho visto un po 'la rappresentazione di un array in memoria con Windbg e il plugin SOS.Qual è l'intestazione di un array in .NET

Qui è il C#:

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; 
    } 
} 

rompo al finale del principale, e io Observ:

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 

posso vedere che l'intestazione contiene la dimensione della matrice (00000007) ma la mia domanda è: qual è il valore 01324530?

Grazie!

risposta

5

Il valore 01.324.530 è la tabella metodo. Questo è il modo in cui .NET implementa i metodi virtuali: ogni metodo è un puntatore a una funzione.

Si noti che il valore dell'array si trova sul puntatore 018a2f64. Vedo che hai scaricato la memoria con dd. Nel caso tu non lo sapessi, puoi anche scaricare l'array con il comando! Da:

!da 018a2f64 
+0

Ma quale puntatore a un metodo sta facendo in un array? – Thomas

+0

Gli array hanno metodi proprio come gli altri oggetti. – SLaks

+0

Le matrici in .NET sono classi, tutte derivanti da 'System.Array'. Dato che esiste una derivazione, c'è una tabella dei metodi virtuale coinvolta per i metodi sovraccaricati. – Blindy

0

Here è un eccellente articolo che descrive gli array in .Net 1.0.

Non so quanto sia cambiato da allora.

0

Che cosa significa MT in questa riga?

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

Immagino che significhi la stessa cosa, dal momento che è lo stesso numero.

(sulla base di un commento di Andrey significa tavolo Method.)