简介

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

内存转储

内存转储非常底层,是从内存地址上观察地址上的内容,常常使用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. 【ElasticSearch】数据迁移方案

    一.需求背景 ES环境要从单机迁移到集群上面 现在已有的数据也要搬过去,有几个索引三四千万数据大概 二.实现方案 有两种,使用ElasticDump和LogStash的ES插件 1.ElasticDu ...

  2. 【Java】Generic 泛型

    Generic 泛型 为什么需要泛型? 集合容器再设计阶段/声明阶段不能确定这个容器实际存储的是什么类型的对象 JDK5 以前只能把元素设计为Object基类 在JDK5之后用泛型来约束对象类型 除了 ...

  3. 【Docker】07 部署挂载本地目录的Tomcat

    1.拉取Tomcat镜像: docker pull tomcat:9.0.37 2.创建并运行Tomcat容器: 挂载容器的webapps目录到本机(宿主机)自己设置的目录 docker run -d ...

  4. pve 安装配置问题集锦

    官网:https://www.proxmox.com/en/ 下载:https://www.proxmox.com/en/downloads 安装:https://pve.proxmox.com/wi ...

  5. 《Python数据可视化之matplotlib实践》 源码 第一篇 入门 第一章

    最近手上有需要用matplotlib画图的活,在网上淘了本实践书,发现没有代码,于是手敲了一遍,mark下. 第一篇    第一章 图1.1 import matplotlib.pyplot as p ...

  6. 树莓派3b+ 安装Ubuntu mate18.04系统 配置SSH 、 远程桌面realvnc

    Ubuntu mate  for  树莓派3b+ 系统下载: 下载地址: https://ubuntu-mate.org/download/ 这里用32位系统:(64位也可以的,虽然还是实验阶段的,不 ...

  7. OpenAI内讧更多细节曝光:奥特曼离间董事会失败

    参考: https://www.thepaper.cn/newsDetail_forward_25512687 ============================== 根据 https://ww ...

  8. mpi4py 官方使用手册

    一直好奇mpi4py的使用手册在哪,找了好久最后在anaconda上发现了线索: https://anaconda.org/conda-forge/mpi4py Home: https://mpi4p ...

  9. batch_norm在强化学习中建议使用的形式

    def batch_norm(layer, **kwargs): """ Apply batch normalization to an existing layer. ...

  10. mybatis升级为mybatis-plus

    1.背景 为了快速开发,需要把之前的老项目升级为mybatis-plus 2.步骤 步骤一:导入jar包 <dependency> <groupId>com.baomidou& ...