.NET高级调试 - 3.7对象检查
简介
在大多数调试会话中,首先需要检查的项目就是分析应用程序的状态。在确认程序的问题是某种无效状态造成的,我们便需要分析程序是如何变成无效状态的。那么在分析过程中,需要为我们深入了解对象的各种审查方法
内存转储
内存转储非常底层,是从内存地址上观察地址上的内容,常常使用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对象检查的更多相关文章
- [Android Studio 权威教程]断点调试和高级调试
好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...
- ###Android 断点调试和高级调试###
转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...
- JavaScript高级篇之Function对象
JavaScript高级篇之Function对象 一: Function对象引入: Function对象是js的方法对象,可以用Function实例化出任何js方法对象. 例如: <%@ pag ...
- Android Stuido中断点调试和高级调试
写一个简单的调试程序 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class M ...
- Linux高级调试与优化——gdb调试命令
番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...
- .NET高级调试系列-Windbg调试入门篇
Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...
- 玩好.NET高级调试,你也要会写点汇编
一:背景 1. 简介 .NET 高级调试要想玩的好,看懂汇编是基本功,但看懂汇编和能写点汇编又完全是两回事,所以有时候看的多,总手痒痒想写一点,在 Windows 平台上搭建汇编环境不是那么容易,大多 ...
- Visual Studio高级调试技巧
1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持嵌入汇编) _asm 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows ...
- 读javascript高级程序设计05-面向对象之创建对象
1.工厂模式 工厂模式是一种常用的创建对象的模式,可以使用以下函数封装创建对象的细节: function CreatePerson(name,age){ var p=new Object(); p.n ...
- 重学《C#高级编程》(对象与类型)
昨天重看了下<C#高级编程>里面的对象与类型一章,发现自己有许多遗漏没懂的地方重新弄清楚明白了 先说说什么是对象吧,我个人的感觉是:在编程的世界里,一段程序就是一个事物的处理逻辑,而对象就 ...
随机推荐
- 【ElasticSearch】数据迁移方案
一.需求背景 ES环境要从单机迁移到集群上面 现在已有的数据也要搬过去,有几个索引三四千万数据大概 二.实现方案 有两种,使用ElasticDump和LogStash的ES插件 1.ElasticDu ...
- 【Java】Generic 泛型
Generic 泛型 为什么需要泛型? 集合容器再设计阶段/声明阶段不能确定这个容器实际存储的是什么类型的对象 JDK5 以前只能把元素设计为Object基类 在JDK5之后用泛型来约束对象类型 除了 ...
- 【Docker】07 部署挂载本地目录的Tomcat
1.拉取Tomcat镜像: docker pull tomcat:9.0.37 2.创建并运行Tomcat容器: 挂载容器的webapps目录到本机(宿主机)自己设置的目录 docker run -d ...
- pve 安装配置问题集锦
官网:https://www.proxmox.com/en/ 下载:https://www.proxmox.com/en/downloads 安装:https://pve.proxmox.com/wi ...
- 《Python数据可视化之matplotlib实践》 源码 第一篇 入门 第一章
最近手上有需要用matplotlib画图的活,在网上淘了本实践书,发现没有代码,于是手敲了一遍,mark下. 第一篇 第一章 图1.1 import matplotlib.pyplot as p ...
- 树莓派3b+ 安装Ubuntu mate18.04系统 配置SSH 、 远程桌面realvnc
Ubuntu mate for 树莓派3b+ 系统下载: 下载地址: https://ubuntu-mate.org/download/ 这里用32位系统:(64位也可以的,虽然还是实验阶段的,不 ...
- OpenAI内讧更多细节曝光:奥特曼离间董事会失败
参考: https://www.thepaper.cn/newsDetail_forward_25512687 ============================== 根据 https://ww ...
- mpi4py 官方使用手册
一直好奇mpi4py的使用手册在哪,找了好久最后在anaconda上发现了线索: https://anaconda.org/conda-forge/mpi4py Home: https://mpi4p ...
- batch_norm在强化学习中建议使用的形式
def batch_norm(layer, **kwargs): """ Apply batch normalization to an existing layer. ...
- mybatis升级为mybatis-plus
1.背景 为了快速开发,需要把之前的老项目升级为mybatis-plus 2.步骤 步骤一:导入jar包 <dependency> <groupId>com.baomidou& ...