《Advanced .NET Debugging》 读书笔记 Listing 2-8: 使用debugger查看对象的Method Table
时间:2010-12-25 来源:李志鹏
1. 用WinDBG打开02TypeSample.exe,执行 .load sosex.dll
2. 执行 !mbp 02typesample.cs 41
3. 执行 g
4. 执行 .loadby sos.dll mscorwks
5. 执行 !clrstack –a ,找到heap上面对象存放的地址。
6. 执行 dd 0x0000000002773610 ,可以找到该对象在Heap上面的原始的值的分布:
其中0xa, 0x5和0xa是对象的instance里面存放的值,而0x7ff000434d0就是Method table的指针。
7. 执行 !dumpmt –md 0x7ff000434d0 ,就可以得到该方法表的描述:
PreJIT表示JIT运行之前就可以有IL了,而JIT运行之后才有的IL,而none表示目前还没有IL。 同时可以发现对于一个只声明了两个method的对象,实际上在heap里面有七个方法,包括四个object继承而来的方法,包括ToString(), Equals(System.Object), GetHashCode()和Finalize()。同时还有一个构造函数ctor。
8. 此时根据ModuleDesc可以找到该方法所在的module。执行 !dumpmd 0x000007ff00043420:
可以找到该方法所在的module的地址为0x000007ff00043e30
9. 此时执行 !dumpmodule 0x000007ff00043e30 就可以找到该module的信息, 或者执行 !dumpmodule –mt 0x000007ff00043e30 得到该module包含的各种method的信息: