技术开发 频道

工欲善其事——.NET底层研究工具

  除了在Visual Studio的立即窗口输入命令,Visual Studio还有一个内存窗口(Debug->Window->Memory),微软想得很周到,有四个内存窗口,你可以同时看好几块内存。

  还是上面那块示例代码,我们来看看内存窗口的作用

  .load sos.dll

  extension C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll loaded

  !dso

  PDB symbol for mscorwks.dll not loaded

  OS Thread Id: 0xa2c (2604)

  ESP/REG Object Name

  002df05c 01b928a4 System.Int32[]

  通过上面的命令,我们发现intArr数组的首地址为01b928a4。打开内存窗口,在Address一栏输入:0x01b928a4(千万记住,这里的0x不能掉了),显示如下:

图4  输入首地址显示

  为了观察方便,我们把内存窗口的Columns设为8,这样就比较对齐了。知道Object Layout的童鞋(我以前的文章也有介绍),应该知道每个Object有两个附加字段:同步块索引和方法表指针,这个01b928a4应该指向的就是方法表指针的位置,那上面内存窗口显示的5c aa c9 6f那就应该是方法表指针了,这里我们不关注这个。但是看到后面居然有一个5,这个难道跟数组的大小有关系么?(猜测,只是猜测)。

  F10继续执行,我们发现内存窗口将内存有变化的地方用红色标识出来了,真是太方便了。

图5  红色标示改变值

  (这个3不是数组第一个元素的值么)

  F10再执行

图6 再次执行

  (这个5不是数组元素的第二个值么)

  聪明的你应该有这样的猜测:

  数组的内存布局是这样的,紧跟在方法表指针后面的是数组的大小,然后是数组的元素的值(按顺序排列)。

  唔,我不知道这是不是正确的,那好,我多试几次,发现我的猜测貌似是正确的。

  你看,上面这种探索的过程,一定会让你难忘,比你看书,看作者在那里“胡侃”要记忆深刻得多。

  除了内存查看窗口,Visual Studio还有寄存器查看窗口(Debug->Window->Registers),还有Threads,Modules等等,等着你去尝试。

  后记

  有了这三个工具,我相信对你的学习一定是如虎添翼。要详细的介绍这些工具,需要大量的篇幅,但是我觉得我只给一个引子,剩下的留给你自己去探索,岂不是更有意思。由于时间和水平有限,难免有不对之处,如有发现请一定要告诉我,谢谢。

查看原文

0
相关文章