《Advanced .NET Debugging》 读书笔记 Listing 3-10到3-14: 得到程序中各对象的内容
时间:2010-12-26 来源:李志鹏
1. 在WinDbg下载入03ObjTypes.exe。
2. 连续执行两次 g, 到程序要求按任意键继续处。
3. 执行 Ctrl + C。
4. 执行 .loadby sos.dll mscorwks
5. 执行 !name2ee 03ObjTypes.exe Advanced.NET.Debugging.Chapter3.ObjTypes.AddCoordinate
6. 按要求执行 !bpmd 命令添加断点
7. 执行 g, 此时程序将在上图的断点处停下。
8. 执行 !clrstach –a :
此时可以发现Main()方法内存在两个local的指针,其中第一个使用!dumpobj 命令可以判定是一个ValueType,因此它是Main()方法内声明的Coordinate类型的object对象。
而第二个指针则应该指向了在Main()方法内声明的ObjTypes类型的ob对象,该obj对象内包括三个对象: coordinate, intArray和strArray。
9. 对于Main方法声明的本地的对象,可以直接使用dd命令得到point对象内的值(0x64 = 100):
10. 对于ReferenceType类型的对象,执行 !DumpObj
可见heap上的该reference type类型的对象包含三个对象, coordinate, intArragy和strArray,其中coordinate为Value Type, 而intArray和strArray为reference type
11. 对于值类型 coordinate,执行 !dumpvc 000007ff000434e0 00000000023d5f58可以得到coordinate的具体的值:
12. 对于reference type的intArray和strArray,由于他们是数组,可以直接执行!dumpArray命令来获得他们值。
执行 !DumpArray –details 0x23d6040 ,可以看到数组内的各元素的值:
13. 对于strArray,执行 !DumpArray –details 0x23d6070 ,可以得到string内各个元素的值: