分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

.net 高级调试学习(2)对象查看

发布时间:2023-09-06 02:04责任编辑:沈小雨关键词:暂无标签

调试的程序源代码如下:

using System;using System.Text;namespace Advanced.NET.Debugging.Chapter3{ ???public class ObjTypes ???{ ???????public struct Coordinate ???????{ ???????????public int xCord; ???????????public int yCord; ???????????public int zCord; ???????????public Coordinate(int x, int y, int z) ???????????{ ???????????????xCord = x; ???????????????yCord = y; ???????????????zCord = z; ???????????} ???????} ???????private Coordinate coordinate; ???????int[] intArray = new int[] { 1, 2, 3, 4, 5 }; ???????string[] strArray = new string[] {"Welcome", ??????????????????????????????????????????"to", ?????????????????????????????????????????"Advanced", ?????????????????????????????????????????".NET", ?????????????????????????????????????????"Debugging"}; ???????static void Main(string[] args) ???????{ ???????????Coordinate point= new Coordinate(100, 100, 100); ???????????Console.WriteLine("Press any key to continue (AddCoordinate)"); ???????????Console.ReadKey(); ???????????ObjTypes ob = new ObjTypes(); ???????????ob.AddCoordinate(point); ???????????Console.WriteLine("Press any key to continue (Arrays)"); ???????????Console.ReadKey(); ???????????ob.PrintArrays(); ???????????????????????Console.WriteLine("Press any key to continue (Generics)"); ???????????Console.ReadKey(); ???????????Comparer<int> c = new Comparer<int>(); ???????????Console.WriteLine("Greater {0}", c.GreaterThan(5, 10)); ???????????Console.WriteLine("Press any key to continue (Exception)"); ???????????Console.ReadKey(); ???????????ob.ThrowException(null); ???????} ???????public void AddCoordinate(Coordinate coord) ???????{ ???????????coordinate.xCord += coord.xCord; ???????????coordinate.yCord += coord.yCord; ???????????coordinate.zCord += coord.zCord; ???????????Console.WriteLine("x:{0}, y:{1}, z:{2}", ?????????????????????????????coordinate.xCord, ?????????????????????????????coordinate.yCord, ?????????????????????????????coordinate.xCord); ???????} ???????public void PrintArrays() ???????{ ???????????foreach (int i in intArray) ???????????{ ???????????????Console.WriteLine("Int: {0}", i); ???????????} ???????????foreach (string s in strArray) ???????????{ ???????????????Console.WriteLine("Str: {0}", s); ???????????} ???????} ???????public void ThrowException(ObjTypes obj) ???????{ ???????????if (obj == null) ???????????{ ???????????????throw new System.ArgumentException("Obj cannot be null"); ???????????} ???????} ???} ???public class Comparer<T> where T: IComparable ???{ ???????public T GreaterThan(T d, T d2) ???????{ ???????????int ret = d.CompareTo(d2); ???????????if (ret > 0) ???????????????return d; ???????????else ???????????????return d2; ???????} ???????public T LessThan(T d, T d2) ???????{ ???????????int ret = d.CompareTo(d2); ???????????if (ret < 0) ???????????????return d; ???????????else ???????????????return d2; ???????} ???}}
View Code

 上面代码使用.net 4编译出可执行exe

具体调试步骤如下:

1、在wdb中执行03ObjTypes.exe程序

2、执行g,运行到提示按任意键继续

3、在windbg手动中断程序

4、执行.loadby sos.dll clr

5、执行 ~0s 切换到主线程

6、执行  !name2ee 03ObjTypes.exe Advanced.NET.Debugging.Chapter3.ObjTypes.AddCoordinate

显示如下结果:

Module: ?????000007fe8eb140c0Assembly: ???03ObjTypes.exeToken: ??????0000000006000002MethodDesc: ?000007fe8eb15a00Name: ???????Advanced.NET.Debugging.Chapter3.ObjTypes.AddCoordinate(Coordinate)Not JITTED yet. Use !bpmd -md 000007fe8eb15a00 to break on run.

7. 执行  !bpmd -md 000007fe8eb15a00 设置断点

8、执行g 使程序继续执行,并且在程序中按任意键,此时程序中断在我们设断点位置

9、执行 !clrstach –a 查看调用栈

OS Thread Id: 0x1598 (0) ???????Child SP ??????????????IP Call Site000000000023eaa0 000007fe8ec2089e *** WARNING: Unable to verify checksum for 03ObjTypes.exeAdvanced.NET.Debugging.Chapter3.ObjTypes.AddCoordinate(Coordinate) [F:\book and sources\adndsrc\Chapter3\ObjTypes\03ObjTypes.cs @ 54] ???PARAMETERS: ???????this (0x000000000023eb30) = 0x00000000027e6cd8 ???????coord (0x000000000023eb98) = 0x0000006400000064000000000023eb30 000007fe8ec2054b Advanced.NET.Debugging.Chapter3.ObjTypes.Main(System.String[]) [F:\book and sources\adndsrc\Chapter3\ObjTypes\03ObjTypes.cs @ 37] ???PARAMETERS: ???????args (0x000000000023ec20) = 0x00000000027e3470 ???LOCALS: ???????0x000000000023ebf0 = 0x0000006400000064 ???????0x000000000023eb90 = 0x00000000027e6cd8 ???????0x000000000023eb88 = 0x0000000000000000000000000023ee50 000007feee254073 [GCFrame: 000000000023ee50] 

10、看到Main函数的locals中有三个局部变量(第三个还未 赋值),

可以使用!dumpobj  0x000000000023ebf0 查看第一个变量,显示错误,说明他是个值类型

<Note: this object has an invalid CLASS field>

执行  dd 0x000000000023ebf0  显示值类型的内容如下

00000000`0023ebf0 ?00000064 00000064 00000064 0000000000000000`0023ec00 ?0023ed08 00000000 0023ee50 0000000000000000`0023ec10 ?0023ec40 00000000 ee254073 000007fe00000000`0023ec20 ?027e3470 00000000 8eb140c0 000007fe00000000`0023ec30 ?00000000 00000000 00000000 0000000000000000`0023ec40 ?0023ed30 00000000 0043a0f0 0000000000000000`0023ec50 ?00000000 00000000 ee253f25 000007fe00000000`0023ec60 ?0023ef08 00000000 ee2e38f1 000007fe

前三个值0x64就是值100,就是对应于代码  Coordinate point= new Coordinate(100, 100, 100);

在ClrStack命令输出中 AddCoordinate栈显示的this参数指针指向当前对象的实例,引用类型使用

!dumpobj  0x00000000027e6cd8 显示如下:

Name: ???????Advanced.NET.Debugging.Chapter3.ObjTypesMethodTable: 000007fe8eb15b28EEClass: ????000007fe8eb126c8Size: ???????48(0x30) bytesFile: ???????C:\ADNDBin 4\03ObjTypes.exeFields: ?????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name000007fe8eb15a98 ?4000001 ??????18 ...jTypes+Coordinate ?1 instance 00000000027e6cf0 coordinate000007feed2daf08 ?4000002 ???????8 ??????System.Int32[] ?0 instance 00000000027e6dd8 intArray000007feed2d9890 ?4000003 ??????10 ?????System.String[] ?0 instance 00000000027e6e50 strArray

VT列 1表示值类型,0表示引用类型

对于值类型,执行 !dumpvc mt  vale可以得到具体的值:

执行 !dumpvc 000007fe8eb15a98  00000000027e6cf0 可以得到coordinate的具体的值:

Name: ???????Advanced.NET.Debugging.Chapter3.ObjTypes+CoordinateMethodTable: 000007fe8eb15a98EEClass: ????000007fe8eb12740Size: ???????32(0x20) bytesFile: ???????C:\ADNDBin 4\03ObjTypes.exeFields: ?????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name000007feed2daf70 ?4000005 ???????0 ????????System.Int32 ?1 instance ???????????????0 xCord000007feed2daf70 ?4000006 ???????4 ????????System.Int32 ?1 instance ???????????????0 yCord000007feed2daf70 ?4000007 ???????8 ????????System.Int32 ?1 instance ???????????????0 zCord

可以看到,coordinate的 x,y,z 都为0

对于引用类型

000007feed2daf08 ?4000002 ???????8 ??????System.Int32[] ?0 instance 00000000027e6dd8 intArray

执行  !DumpObj /d 00000000027e6dd8显示

Name: ???????System.Int32[]MethodTable: 000007feed2daf08EEClass: ????000007feecce2e90Size: ???????44(0x2c) bytesArray: ??????Rank 1, Number of elements 5, Type Int32 (Print Array)Fields:None

显示更具体的数组信息可以执行!DumpArray -details 00000000027e6dd8

Name: ???????System.Int32[]MethodTable: 000007feed2daf08EEClass: ????000007feecce2e90Size: ???????44(0x2c) bytesArray: ??????Rank 1, Number of elements 5, Type Int32Element Methodtable: 000007feed2daf70[0] 00000000027e6de8 ???Name: ???????System.Int32 ???MethodTable: 000007feed2daf70 ???EEClass: ????000007feecce2e20 ???Size: ???????24(0x18) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?400055f ???????0 ????????????System.Int32 ?????1 ????instance ???????????????????1 ????m_value[1] 00000000027e6dec ???Name: ???????System.Int32 ???MethodTable: 000007feed2daf70 ???EEClass: ????000007feecce2e20 ???Size: ???????24(0x18) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?400055f ???????0 ????????????System.Int32 ?????1 ????instance ???????????????????2 ????m_value[2] 00000000027e6df0 ???Name: ???????System.Int32 ???MethodTable: 000007feed2daf70 ???EEClass: ????000007feecce2e20 ???Size: ???????24(0x18) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?400055f ???????0 ????????????System.Int32 ?????1 ????instance ???????????????????3 ????m_value[3] 00000000027e6df4 ???Name: ???????System.Int32 ???MethodTable: 000007feed2daf70 ???EEClass: ????000007feecce2e20 ???Size: ???????24(0x18) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?400055f ???????0 ????????????System.Int32 ?????1 ????instance ???????????????????4 ????m_value[4] 00000000027e6df8 ???Name: ???????System.Int32 ???MethodTable: 000007feed2daf70 ???EEClass: ????000007feecce2e20 ???Size: ???????24(0x18) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?400055f ???????0 ????????????System.Int32 ?????1 ????instance ???????????????????5 ????m_value

可以看到value列 就是数组的值1 2 3 4 5

如果对数组的指针进行转储命令,执行dd 00000000027e6dd8显示如下

00000000`027e6dd8 ?ed2daf08 000007fe 00000005 0000000000000000`027e6de8 ?00000001 00000002 00000003 0000000400000000`027e6df8 ?00000005 00000000 00000000 0000000000000000`027e6e08 ?ed2db0f0 000007fe 00000000 0000000000000000`027e6e18 ?00000000 00000000 00000000 0000000000000000`027e6e28 ?00000000 00000000 00000000 0000000000000000`027e6e38 ?00000000 00000000 8eb15d70 000007fe00000000`027e6e48 ?00000000 00000000 ed2d9890 000007fe

在此实例中,第一二数值 ed2daf08 000007fe 数组类型本身的方法表,

对于值类型数组,第三四值 00000005 00000000就是数组大小,后面就是数组内容

00000001 00000002 00000003 0000000400000000`027e6df8 ?00000005

PS :书中的例子说的是 对于数值数组,第一数值是数组方法表,第二数值是数组大小,后面是数组内容,

还有对于引用类型数组,第一数值是方法表,第二数值是数组大小,第三数值是数组元素的方法表,后面才是数组内容

,但我这例子中不一样,不知是否与x64、 x86程序还是.net4 或.net2不同有关。下面看到的引用类型数组也是和我上面说的例子是一样的:第一数值是数组方法表,第二数值是数组大小,后面是数组内容

下面对

000007feed2d9890 ?4000003 ??????10 ?????System.String[] ?0 instance 00000000027e6e50 strArray
执行  !DumpArray -details 00000000027e6e50 可以看到sting[]数组的内容如下:

Name: ???????System.String[]MethodTable: 000007feed2d9890EEClass: ????000007feecce24a8Size: ???????64(0x40) bytesArray: ??????Rank 1, Number of elements 5, Type CLASSElement Methodtable: 000007feed2d8548[0] 00000000027e6d08 ???Name: ???????System.String ???MethodTable: 000007feed2d8548 ???EEClass: ????000007feecc24ab8 ???Size: ???????40(0x28) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???String: ?????????Welcome ???????Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?4000243 ???????8 ????????????System.Int32 ?????1 ????instance ???????????????????7 ????m_stringLength ???????000007feed2d96f8 ?4000244 ???????c ?????????????System.Char ?????1 ????instance ??????????????????57 ????m_firstChar ???????000007feed2d8548 ?4000248 ??????80 ???????????System.String ?????0 ??????shared ??????????static ????Empty ????????????????????????????????????>> Domain:Value ?????00000000003e7860:NotInit ?????<<[1] 00000000027e6d30 ???Name: ???????System.String ???MethodTable: 000007feed2d8548 ???EEClass: ????000007feecc24ab8 ???Size: ???????30(0x1e) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???String: ?????????to ???????Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?4000243 ???????8 ????????????System.Int32 ?????1 ????instance ???????????????????2 ????m_stringLength ???????000007feed2d96f8 ?4000244 ???????c ?????????????System.Char ?????1 ????instance ??????????????????74 ????m_firstChar ???????000007feed2d8548 ?4000248 ??????80 ???????????System.String ?????0 ??????shared ??????????static ????Empty ????????????????????????????????????>> Domain:Value ?????00000000003e7860:NotInit ?????<<[2] 00000000027e6d50 ???Name: ???????System.String ???MethodTable: 000007feed2d8548 ???EEClass: ????000007feecc24ab8 ???Size: ???????42(0x2a) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???String: ?????????Advanced ???????Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?4000243 ???????8 ????????????System.Int32 ?????1 ????instance ???????????????????8 ????m_stringLength ???????000007feed2d96f8 ?4000244 ???????c ?????????????System.Char ?????1 ????instance ??????????????????41 ????m_firstChar ???????000007feed2d8548 ?4000248 ??????80 ???????????System.String ?????0 ??????shared ??????????static ????Empty ????????????????????????????????????>> Domain:Value ?????00000000003e7860:NotInit ?????<<[3] 00000000027e6d80 ???Name: ???????System.String ???MethodTable: 000007feed2d8548 ???EEClass: ????000007feecc24ab8 ???Size: ???????34(0x22) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???String: ?????????.NET ???????Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?4000243 ???????8 ????????????System.Int32 ?????1 ????instance ???????????????????4 ????m_stringLength ???????000007feed2d96f8 ?4000244 ???????c ?????????????System.Char ?????1 ????instance ??????????????????2e ????m_firstChar ???????000007feed2d8548 ?4000248 ??????80 ???????????System.String ?????0 ??????shared ??????????static ????Empty ????????????????????????????????????>> Domain:Value ?????00000000003e7860:NotInit ?????<<[4] 00000000027e6da8 ???Name: ???????System.String ???MethodTable: 000007feed2d8548 ???EEClass: ????000007feecc24ab8 ???Size: ???????44(0x2c) bytes ???File: ???????C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll ???String: ?????????Debugging ???????Fields: ?????????????????????MT ???Field ??Offset ????????????????Type VT ????Attr ???????????Value Name ???????000007feed2daf70 ?4000243 ???????8 ????????????System.Int32 ?????1 ????instance ???????????????????9 ????m_stringLength ???????000007feed2d96f8 ?4000244 ???????c ?????????????System.Char ?????1 ????instance ??????????????????44 ????m_firstChar ???????000007feed2d8548 ?4000248 ??????80 ???????????System.String ?????0 ??????shared ??????????static ????Empty ????????????????????????????????????>> Domain:Value ?????00000000003e7860:NotInit ?????<<

看到输出的string 行,上面红色标的就是字符串的值

执行dd 00000000027e6e50

可以看到

00000000`027e6e50 ?ed2d9890 000007fe 00000005 0000000000000000`027e6e60 ?027e6d08 00000000 027e6d30 0000000000000000`027e6e70 ?027e6d50 00000000 027e6d80 0000000000000000`027e6e80 ?027e6da8 00000000 00000000 8000000000000000`027e6e90 ?ed2d8548 000007fe 00000013 003a007800000000`027e6ea0 ?0030007b 002c007d 00790020 007b003a00000000`027e6eb0 ?007d0031 0020002c 003a007a 0032007b00000000`027e6ec0 ?0000007d 00000000 00000000 00000000

.net 高级调试学习(2)对象查看

原文地址:https://www.cnblogs.com/karl-F/p/9310884.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved