2010-03-25 2 views
5

Я немного видел представление массива в памяти с плагинами Windbg и SOS.Что такое заголовок массива в .NET.

Здесь 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; 
    } 
} 

я нарушу в финале Main, и я 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 

Я могу видеть, что заголовок содержит размер массива (00000007) но мой вопрос: что такое значение 01324530?

Спасибо!

ответ

5

Значение 01324530 является таблица метод. Это то, как .NET реализует виртуальные методы - каждый метод является указателем на функцию.

Обратите внимание, что значение массива находится у указателя 018a2f64. Я вижу, что вы сбросили память с помощью dd. Если вы этого не знали, вы можете также сбросить массив с помощью команды! Da:

!da 018a2f64 
+0

Но какой указатель на метод делает в массиве? – Thomas

+0

Массивы имеют методы, подобные другим объектам. – SLaks

+0

Массивы в .NET - это классы, все из которых получены из 'System.Array'. Поскольку существует деривация, для перегруженных методов используется таблица виртуальных методов. – Blindy

0

Here - отличная статья, описывающая массивы в .Net 1.0.

Я не знаю, сколько изменилось с тех пор.

0

Что означает MT в этой строке?

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

Я предполагаю, что это означает одно и то же, поскольку это то же самое число.

(основано на комментарий Андрея это означает метод таблицы.)

Смежные вопросы