.NET 中数组的标头是什么
我用 Windbg 和 SOS 插件稍微了解了内存中数组的表示。
这是 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 的final处中断,我观察到:
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 是什么?
谢谢 !
I have a little bit seen the representation of an array in memory with Windbg and SOS plugin.
Here it is the 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;
}
}
I break at final of Main, and I 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
I can see that the header contains the size of the array (00000007) but my question is : what is the value 01324530 ?
Thanks !
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
值 01324530 是方法表。这就是 .NET 实现虚拟方法的方式——每个方法都是一个指向函数的指针。
请注意,数组的值位于指针 018a2f64 处。我看到你用 dd 转储了内存。如果您不知道,您还可以使用 !da 命令转储数组:
The value 01324530 is the method table. This is how .NET implements virtual methods-- each method is a pointer to a function.
Note that the value of the array is at the pointer 018a2f64. I see you dumped the memory with dd. In case you didn't know, you can also dump the array with the !da command:
这行中的 MT 是什么意思?
我猜这意味着同样的事情,因为它是相同的数字。
(根据安德烈的评论,它意味着方法表。)
What does MT mean in this line?
I'm guessing it means the same thing, since it is the same number.
(based on Andrey's comment it means Method table.)