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

调试的程序源代码如下:

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;
        }
    }
}

上面代码使用.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:      000007fe8eb140c0
Assembly:    03ObjTypes.exe
Token:       0000000006000002
MethodDesc:  000007fe8eb15a00
Name:        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 Site
000000000023eaa0 000007fe8ec2089e *** WARNING: Unable to verify checksum for 03ObjTypes.exe
Advanced.NET.Debugging.Chapter3.ObjTypes.AddCoordinate(Coordinate) [F:\book and sources\adndsrc\Chapter3\ObjTypes\03ObjTypes.cs @ 54]
    PARAMETERS:
        this (0x000000000023eb30) = 0x00000000027e6cd8
        coord (0x000000000023eb98) = 0x0000006400000064

000000000023eb30 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 = 0x0000000000000000

000000000023ee50 000007feee254073 [GCFrame: 000000000023ee50] 

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

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

<Note: this object has an invalid CLASS field>

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

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

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

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

!dumpobj  0x00000000027e6cd8 显示如下:

Name:        Advanced.NET.Debugging.Chapter3.ObjTypes
MethodTable: 000007fe8eb15b28
EEClass:     000007fe8eb126c8
Size:        48(0x30) bytes
File:        C:\ADNDBin 4\03ObjTypes.exe
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fe8eb15a98  4000001       18 ...jTypes+Coordinate  1 instance 00000000027e6cf0 coordinate
000007feed2daf08  4000002        8       System.Int32[]  0 instance 00000000027e6dd8 intArray
000007feed2d9890  4000003       10      System.String[]  0 instance 00000000027e6e50 strArray

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

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

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

Name:        Advanced.NET.Debugging.Chapter3.ObjTypes+Coordinate
MethodTable: 000007fe8eb15a98
EEClass:     000007fe8eb12740
Size:        32(0x20) bytes
File:        C:\ADNDBin 4\03ObjTypes.exe
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007feed2daf70  4000005        0         System.Int32  1 instance                0 xCord
000007feed2daf70  4000006        4         System.Int32  1 instance                0 yCord
000007feed2daf70  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: 000007feed2daf08
EEClass:     000007feecce2e90
Size:        44(0x2c) bytes
Array:       Rank 1, Number of elements 5, Type Int32 (Print Array)
Fields:
None

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

Name:        System.Int32[]
MethodTable: 000007feed2daf08
EEClass:     000007feecce2e90
Size:        44(0x2c) bytes
Array:       Rank 1, Number of elements 5, Type Int32
Element 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 00000000
00000000`027e6de8  00000001 00000002 00000003 00000004
00000000`027e6df8  00000005 00000000 00000000 00000000
00000000`027e6e08  ed2db0f0 000007fe 00000000 00000000
00000000`027e6e18  00000000 00000000 00000000 00000000
00000000`027e6e28  00000000 00000000 00000000 00000000
00000000`027e6e38  00000000 00000000 8eb15d70 000007fe
00000000`027e6e48  00000000 00000000 ed2d9890 000007fe

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

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

00000001 00000002 00000003 00000004
00000000`027e6df8  00000005

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

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

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

下面对

000007feed2d9890  4000003       10      System.String[]  0 instance 00000000027e6e50 strArray执行  !DumpArray -details 00000000027e6e50 可以看到sting[]数组的内容如下:
Name:        System.String[]
MethodTable: 000007feed2d9890
EEClass:     000007feecce24a8
Size:        64(0x40) bytes
Array:       Rank 1, Number of elements 5, Type CLASS
Element 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 00000000
00000000`027e6e60  027e6d08 00000000 027e6d30 00000000
00000000`027e6e70  027e6d50 00000000 027e6d80 00000000
00000000`027e6e80  027e6da8 00000000 00000000 80000000
00000000`027e6e90  ed2d8548 000007fe 00000013 003a0078
00000000`027e6ea0  0030007b 002c007d 00790020 007b003a
00000000`027e6eb0  007d0031 0020002c 003a007a 0032007b
00000000`027e6ec0  0000007d 00000000 00000000 00000000

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

时间: 2024-11-13 07:58:49

.net 高级调试学习(2)对象查看的相关文章

.net 高级调试学习(3)异常查看

还是 .net 高级调试学习(2)中的源代码, 运行调试程序到输出异常,windbg自动中断后, 1.执行.loadby sos clr 2.执行!printexception ,(PS :缩写!pe)看到如下: Exception object: 0000000002557cb8 Exception type: System.ArgumentException Message: Obj cannot be null InnerException: <none> StackTrace (gen

JavaScript高级程序设计学习笔记--错误处理与调试

try-catch语句 只要代码中包含finally子句,则无论try或catch语句块中包含什么代码--甚至return语句,都不会阻止finally子句的执行,来看下面这个函数: function testFinally(){ try{ return 2; }catch(error){ return 1; }finally{ return 0; } } 调用这个函数会返回0(PS:但我实际执行的时候会先返回0,再返回2) 抛出错误 与try-catch语句相配的还有一个throw操作符,用于

JavaScript高级程序设计学习笔记--基本概念

1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; //有效的语句--推荐 虽然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它.两个原因:1.加上分号可以避免很多错误 2.加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必再花时间 推测应该在哪里插入分号了. 2.变量 var message="hi"; 像这样初始化变量

[Android Studio 权威教程]断点调试和高级调试

有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我见过最棒的. 好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for (int i = 0; i < 10; i++) { //获取当前i的值     int selector = i;     //打log查看当前i的值(此步多余,实际开发请忽略)

SEO艺术——使用高级搜索 学习体会

前言: 在这个信息大爆炸的时代,网上的信息鱼龙混杂,有的时候我们费尽体力脑力也得不到自己想要的结果.在这个环境下,学习一个高级的搜索技术是一个现代人越来越需要掌握的一门技术和方法.于是,自己利用自己的业余时间,学习SEO的艺术,学会使用高级搜索技巧的同时,也学习影响网站搜索排名的重要因素和提高网站搜索排名的重要方法. 这是一门非常有用的技术,对于一个即将走向IT行业岗位的人来说,学习SEO技术可以大大提高自己对IT这个行业的认识和理解.借来了SEO的艺术这本书,进行初步的学习,现在整理一下高级搜

[Java学习笔记]对象克隆

对象克隆: 浅克隆: 被克隆的对象中的值类型数据被复制一份新值,但是引用的对象只被复制其引用传递给新克隆出来的对象 深克隆: 被克隆的对象中的值类型数据被复制一份新值,并且其中引用的对象会重新创建新的对象,把新对象的引用传递给新克隆出来的对象 Java中实现克隆: Java中Object中定义了clone方法,默认为浅克隆操作,即你只是简单super.clone得到的结果是浅克隆的结果,如果需要深克隆,则需要实现Cloneable接口,并且重写clone方法 查看Java源代码发现Object中

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var

OD调试学习笔记7—去除未注册版软件的使用次数限制

OD调试学习笔记7—去除未注册版软件的使用次数限制 本节使用的软件链接 (想自己试验下的可以下载) 一:破解的思路 仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需要你掏腰包来获得更多的功能或者解除限制.那么我们就可以逆向的来思考,如果该程序成功的注册后,那么程序的行为必将发生变化,如NAG去除了,如功能限制没有了等等.也就是说,程序的代码的走法也会跟未注册的时候截然不同.因为程序的行为改变了,那么决定它所有行为的代码走法也会发生变化. 二:认识OD的两种断点

Javascript高级程序设计学习笔记

3. 基本概念 基本数据类型:Undefined,Null,Boolean,Number,String. 复杂数据类型:Object. 3.6 语句 switch比较值时用的是全等运算符 “===” ,因此不会进行类型转换.例如 “10” 不等于10. 3.7 函数 ECMAScript函数不介意传递进来多少个参数,也不在乎参数的类型.即使定义的函数只接受两个参数,在调用的时候也可以传递任意多个或者0个.因为ECMAScript的参数在内部是用一个数组表示的,在函数体内部可以通过argument