《Advanced .NET Debugging》 读书笔记 Listing 3-10到3-14: 得到程序中各对象的内容
2010-12-26 19:33
471 查看
针对的程序为03ObjTypes.cs,其部分代码如下,试图让程序在断点处,得到其中ObjTypes中的coordinate对象,intArray对象,strArray对象和本地的point对象的具体值。
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内各个元素的值:
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内各个元素的值:
相关文章推荐
- 《Advanced .NET Debugging》 读书笔记 Listing 2-2: 找到托管程序02simple的入口点
- 《Advanced .NET Debugging》 读书笔记 Listing 4-4: 调试Assembly加载失败的程序
- 《Advanced .NET Debugging》 读书笔记 Listing 5-4: 具有Finalize方法的简单对象
- 《Advanced .NET Debugging》 读书笔记 Listing 2-7: 使用debugger查看对象的syncblk的数据
- 《Advanced .NET Debugging》 读书笔记 Listing 3-4/3-5: 为breakpoint.exe程序的AddAndPrint方法加上breakpoint
- 《Advanced .NET Debugging》 读书笔记 Listing 3-2: 如何查看程序的PID
- 《Advanced .NET Debugging》 读书笔记 Listing 3-6: 使用sxe在程序载入mscorwks之后停下来载入sos
- 《Advanced .NET Debugging》 读书笔记 Listing 3-3: 使用debugger调试一个已经在运行的程序
- 《Advanced .NET Debugging》 读书笔记 Listing 3-8/3-9: 为托管代码设置断点的过程
- 《Advanced .NET Debugging》 读书笔记 Listing 6-8: Orphaned lock的示例
- 《Advanced .NET Debugging》 读书笔记 Listing 5-5: LOH的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 3-1: 调试器的使用
- 《Advanced .NET Debugging》 读书笔记 Listing 5-6: Pining的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 2-5/2-6: 使用debugger找到value type和reference type
- 《Advanced .NET Debugging》 读书笔记 Listing 5-8: Fragmentation的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 4-1/2/3: 调试 FileNotFoundException
- 《Advanced .NET Debugging》 读书笔记 Listing 5-3: Object的Roots的示例
- 《Advanced .NET Debugging》 读书笔记 Listing 6-4: Deadlock的简单示例
- 《Advanced .NET Debugging》 读书笔记 Listing 5-2: GC代龄的示例
- 《Advanced .NET Debugging》 读书笔记 Listing 2-1: 找到notepad.exe的入口点