汇总学到的知识才是对上一年最好的总结。
CLR中的Object的Memory Layout是由一个4 byte的Syncblk,一个4 byte的TypeHandle以及之后的Instance Fields之类组成的。TypeHandle中又包含了重要的MethodTable和EEClass数据结构,这两个数据结构的实例对一个Type来说都只有一个。
通过Windbg来观察这个Object,首先找到这个Object的reference:

然后dd 0x0184274 - 0x4,ObjetRef实际上是指向TypeHandle而非Syncblck,所以需要减4。

这里可以看出Syncblk的值是08000001,TypeHandle是00233090,之后的三个是instance的值,分别是10,5,10。
TypeHandle是一个指向MethodTable的指针。
再一次通过Windbg来看这个指针的内容:

通过观察可以发现示意图似乎不准确,可能实现细节改过了。00232c5c才是一个指向EEClass的指针,002312a8是一个指向Module的指针。之后似乎又有4个连续的指针地址:594f6a90 -> 595674c0,这四个其实是4个method。看过Raw memory之后再用过sos来看看这个MethodTable
又见到了594f6a90这个地址,先看看这个的MSIL:
似乎是一个ToString(),再来看看sos:

两者一致。继续用sos来观察这个EEClass和Module两个数据结构。
这只是所有Managed Object中的一小部分,很多内容还有待挖掘。


曲高和寡呀。即便做技术的,不做这一块还是看不懂,或没功夫看仔细,比方说我 :(
ReplyDelete但不老歌主要是写给自己看的,你的地盘你做主不用理会旁人死活。一些东西不写下来还真不敢确认自己想明白了。