为什么syncblk位于-4而不是0?

时间:2010-10-05 03:45:20

标签: windbg sos

因此,如果你想查看对象的同步块,在sos下你必须在对象地址之前查看-4个字节(在32位机器上)。有谁知道返回4个字节的智慧是什么?我的意思是他们可以在0处同步块,然后在+4处键入句柄,然后在+8处键入对象字段。

2 个答案:

答案 0 :(得分:1)

这是一个实现细节,因此我无法告诉您放置同步块的确切原因。但是,如果查看共享源CLI,您将看到运行时对如何分配和使用对象进行了各种优化,实际上与单个实例关联的数据位于多个不同的位置。例如,syncblock只是位于其他位置的结构的索引值。类似地,MethodTable和EEClass存储在别处。这些都是实现细节。重要的一点是IMO正在理解如何挖掘调试过程中所需的信息。理解实现细节的原因并不重要。

答案 1 :(得分:0)

我认为它符合预期,特别是对于explicitly laid out的结构。正如Brian所说,这只是一个实现细节。它类似于malloc的多少个实现将分配比请求的空间更多的空间,将分配大小存储在前四个(或八个)字节中,然后返回一个偏移的指针,指向超出该值的下一个字节。