简介

在大多数调试会话中,首先需要检查的项目就是分析应用程序的状态。在确认程序的问题是某种无效状态造成的,我们便需要分析程序是如何变成无效状态的。那么在分析过程中,需要为我们深入了解对象的各种审查方法

内存转储

内存转储非常底层,是从内存地址上观察地址上的内容,常常使用d系列命令观察



对象的“类型显示存储于其表现形式中”从实现角度来看,它指的是MethodTable。这就也是对象互相引用的引用点。但是在Method Table之前,还有一个object header . 所以为什么说 object header 位于“负索引”的原因。因此要完整展示一个引用类型对象。需要address-0x4(64位程序需要-0x8) 。才是一个完整的内存布局。

托管对象转储

有时候直接把内存转储出来会很直观,但调试托管代码时,如果能将CLR对象以一种更加结构化和易阅的形式转储出来,会更加优雅。

引用类型转储

使用!dumpobj 命令来更加友好的转储出引用类型,更加一目了然。

Fields解释:

Field Offset Type VT Attr Value Nmae
这个域的元数据 偏移量 类型 为1表示是值类型,为0代表是引用类型 对象的属性 域的值 域的名字

如果值类型数据作为引用类型的一部分,那么它也会被视为引用类型分配在托管堆中。那么如何查看值类型的内容呢?

使用!dumpvc 命令即可查看。

    internal class Program
{
static void Main(string[] args)
{
var s = new MyStruct(100, 101, 102); var o = new
{
x = s
};
Debugger.Break();
} }
public struct MyStruct
{
public MyStruct(int x,int y,int z)
{
this.x= x; this.y = y; this.z = z;
}
public int x;
public int y;
public int z;
}

值类型转储

如果是值类型,使用!dumpobj会显示一个错误,我们可以利用此特性来判断一个对象是引用类型还是值类型

由于值类型解释其自身,我们直接使用d命令即可



数组的转储

可以使用!dumparray 命令来转储数组

值类型数组

数组的内存结构如下

        static void Main(string[] args)
{
int[] intArr = { 10, 11, 12, 13, 14, 15, 16, 17 }; Debugger.Break();
}

可以看到内存布局与代码一一对应

引用类型数组

        static void Main(string[] args)
{
string[] stringArr = { "10", "11","12","13","14","15" };
Debugger.Break();
}

总结

.NET高级调试 - 3.7对象检查的更多相关文章

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

    好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...

  2. ###Android 断点调试和高级调试###

    转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...

  3. JavaScript高级篇之Function对象

    JavaScript高级篇之Function对象 一: Function对象引入: Function对象是js的方法对象,可以用Function实例化出任何js方法对象. 例如: <%@ pag ...

  4. Android Stuido中断点调试和高级调试

    写一个简单的调试程序 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class M ...

  5. Linux高级调试与优化——gdb调试命令

    番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...

  6. .NET高级调试系列-Windbg调试入门篇

    Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...

  7. 玩好.NET高级调试,你也要会写点汇编

    一:背景 1. 简介 .NET 高级调试要想玩的好,看懂汇编是基本功,但看懂汇编和能写点汇编又完全是两回事,所以有时候看的多,总手痒痒想写一点,在 Windows 平台上搭建汇编环境不是那么容易,大多 ...

  8. Visual Studio高级调试技巧

    1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持嵌入汇编) _asm 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows ...

  9. 读javascript高级程序设计05-面向对象之创建对象

    1.工厂模式 工厂模式是一种常用的创建对象的模式,可以使用以下函数封装创建对象的细节: function CreatePerson(name,age){ var p=new Object(); p.n ...

  10. 重学《C#高级编程》(对象与类型)

    昨天重看了下<C#高级编程>里面的对象与类型一章,发现自己有许多遗漏没懂的地方重新弄清楚明白了 先说说什么是对象吧,我个人的感觉是:在编程的世界里,一段程序就是一个事物的处理逻辑,而对象就 ...

随机推荐

  1. 【郝斌C ST】指针 swap问题

    C语言 指针 swap问题 在主函数种实现变量的交换 现在我们把这交换的行为封装进方法中 swap函数确实进行了交换,打印也是10和5了,但是下面a和b的结果还是5和10 - 形参i 和 形参j 并不 ...

  2. PyTorch视觉模型库torchvision.models介绍

    安装pytorch时我们一般都是会一并选择安装自带的视觉模型库 torchvision ,  该库不仅有经典的视觉模型结构同时还提供了对应参数的下载功能,可以说torchvision库是十分方便于研究 ...

  3. linux终端如何加上时间,添加时间戳到终端提示?

    方法: 在 .bashrc 文件中加入: export PROMPT_COMMAND="echo -n \[\$(date +%H:%M:%S)\\] " 这样便可以在每次输入命令 ...

  4. 使用TensorFlow、Pytorch等深度学习框架时如何设置对OpenCV的使用

    如题: 在使用深度学习框架时如果同时也在使用opencv那么有一些设置是需要设定的,第一个就是在python代码中设定禁止使用opencl: cv2.ocl.setUseOpenCL(False) o ...

  5. python语言绘图:绘制一组二项分布图

    代码源自: https://github.com/PacktPublishing/Bayesian-Analysis-with-Python ============================= ...

  6. C# 工厂模式 个人基本流程

    有个前提 本文并不会介绍工厂模式,只是记录在实际当中个人比较喜欢的工厂写法.仅仅作为备忘和参考. 开始流程 定义一个抽象类,包含一些公共的业务逻辑(也可以是接口) /// <summary> ...

  7. Apache DolphinScheduler 在奇富科技的首个调度异地部署实践

    奇富科技(原360数科)是人工智能驱动的信贷科技服务平台,致力于凭借智能服务.AI研究及应用.安全科技,赋能金融机构提质增效,助推普惠金融高质量发展,让更多人享受到安全便捷的金融科技服务.作为国内领先 ...

  8. .NET静态代码编织——肉夹馍(Rougamo)4.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo),一款编译时AOP组件.相比动态代理AOP需要在应用启动时进行初始化,编译时完成代码编织的肉夹馍减少 ...

  9. SpringBoot整合RabbitMQ 通俗易懂 超详细 【内含案例】

    SpringBoot结合RabbitMq SpringBoot 框架部署 HelloWorld 简单模式 Topic 通配符模式 一.SpringBoot 框架部署 1.创建Maven工程(我用的ID ...

  10. 使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验

    前言 当前.NET环境下,生成WebApi代理类的工具已经有很多选择了,比如OpenApi Generator,NSwag和Refitter等,不同的工具生成的代码风格以及实现方式略有不同,比如Ref ...