首页 > 其他分享 >.NET高级调试 - 3.7对象检查

.NET高级调试 - 3.7对象检查

时间:2024-10-08 13:44:18浏览次数:9  
标签:int 转储 3.7 引用 类型 NET public 调试 内存

简介

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

内存转储

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

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

托管对象转储

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

引用类型转储

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

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

image

值类型转储

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

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

数组的转储

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

值类型数组

数组的内存结构如下
image

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

            Debugger.Break();
        }

image

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

引用类型数组

image

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

image

总结

image

标签:int,转储,3.7,引用,类型,NET,public,调试,内存
From: https://www.cnblogs.com/lmy5215006/p/18441339

相关文章

  • C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿,推荐或自荐优质文章/项目/学习资源等。......
  • 【源码+文档+调试讲解】基于Android的固定资产借用管理平台
    摘 要固定资产借用管理平台设计的目的是为用户提供使用申请、故障报修、设备归还、意见反馈等管理方面的平台。与PC端应用程序相比,固定资产借用管理平台的设计主要为管理员和用户提供便利。用户可以通过Android及时查看设备信息等。固定资产借用管理平台是在Android操作......
  • gdb调试
    1、https://gitee.com/下载课程代码,编译运⾏"bestidiocs2024/ch02/c/testgdb.c",记录编译运⾏结果(2分)运行结果:Thesumof1-50is12752、参考https://www.cnblogs.com/rocedu/p/16714289.html调试代码,⾄少涵盖4种断点(⾏断点,函数断点,临时断点,条件断点)行断点:bmain函数断点:b......
  • 4、.Net 快速开发框架:Blog.Core - 开源项目研究文章
    Blog.Core是一个基于.NETCore的开源博客系统,旨在提供一个简单、易用且功能丰富的博客平台。它采用最新的.NET技术栈,包括但不限于ASP.NETCore、EntityFrameworkCore、RazorPages等,以确保高性能和良好的开发体验。主要特性跨平台:作为.NETCore应用程......
  • Vulnhub 靶机 THE PLANETS: EARTH
    0x01信息收集1.1、nmap扫描IP段扫描,确定靶机地址平扫描nmap192.168.1.0/24扫描结果(部分)Nmapscanreportforearth.local(192.168.1.129)Hostisup(0.0015slatency).Notshown:983filteredtcpports(no-response),14filteredtcpports(admin-prohibited)P......
  • 【Kubernetes】常见面试题汇总(五十七)
    目录125.K8S创建服务status为ErrlmagePull?126.不能进入指定容器内部?特别说明:题目  1-68  属于【Kubernetes】的常规概念题,即“汇总(一)~(二十二)”。题目 69-113 属于【Kubernetes】的生产应用题,其中104-113为“情景类”。题目114-132属于【Kube......
  • VM 设置net端口
         虚拟机需要设置成桥接模式,并重新启动虚拟机,这样其他电脑才可以正常访问到服务tomcat。  ......
  • VMware Aria Operations for Networks 6.13 发布,新增功能概览
    VMwareAriaOperationsforNetworks6.13-网络和应用监控工具请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-networks/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwareAriaOperationsforNetworks(以前称为vRealizeNetworkInsigh......
  • Kubernetes 和 docker 之间的版本对应关系
       Kubernetes和Docker是两个紧密相关的技术,Docker被广泛用于构建和运行容器,而Kubernetes用于编排这些容器。在早期,Kubernetes依赖Docker作为其容器运行时(ContainerRuntime),因此了解Kubernetes与Docker版本之间的兼容性是非常重要的。   然而,从Kube......
  • OpenAI 发布适用于 .NET 库的稳定版本
    OpenAI在6月发布测试版后发布了其官方.NET库的稳定版本。它以NuGet包的形式提供,支持GPT-4o和GPT-4omini等最新模型,以及完整的OpenAIRESTAPI。该版本包括同步和异步API、流式聊天完成以及用于提高API一致性的关键性更改。开发人员可以扩展该库,并在支持.NETStan......