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

Windbg 为什么syncblk位于-4而不是0?,windbg,sos,Windbg,Sos,因此,如果您想查看对象的同步块,在sos下,您必须查看对象地址之前的-4字节(在32位机器上)。有人知道返回4字节的智慧是什么吗?我的意思是,他们可以在0处有同步块,然后在+4处键入句柄,然后在+8处键入对象字段 这是一个实现细节,因此我无法给出放置syncblock的确切原因。但是,如果查看共享源CLI,您将看到运行时对对象的分配和使用方式进行了各种优化,并且实际上与单个实例关联的数据位于多个不同的位置。例如,syncblock只是位于其他位置的结构的索引值。类似地,MethodTable和E

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

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

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

我明白了,正如你所见,我对这个论坛太陌生了。我现在已经将其中一些标记为答案(希望没有任何错误)。非常感谢你指出这一点appreciated@Brain,我知道这是实现细节,但我也知道性能对于GC团队来说非常接近和重要。我只是好奇为什么选择这个设计,而不是让syncBlock从0开始。