首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【愚公系列】2023年10月 .NET CORE工具案例-控制台调试神器之Dumpify

【愚公系列】2023年10月 .NET CORE工具案例-控制台调试神器之Dumpify

作者头像
愚公搬代码
发布2025-06-01 12:32:00
发布2025-06-01 12:32:00
1920
举报
文章被收录于专栏:历史专栏历史专栏

🚀前言

Dumpify 是.NET程序员的调试神器,它能够帮助程序员快速地定位和解决.NET程序中的问题。它在调试过程中能够生成.NET应用程序的内存转储文件(也称为dump文件),并分析和显示相关信息。Dump文件包含了.NET应用程序在运行时的所有状态和信息,包括变量、堆栈、线程和内存中的对象等。使用Dumpify可以快速地分析和定位.NET应用程序的问题,减少调试时间和提高效率。

Dumpify官网:https://github.com/MoaidHathot/Dumpify

🚀一、Dumpify

🔎1.安装Dumpify

代码语言:javascript
复制
dotnet add package Dumpify
Install-Package Dumpify

🔎2.Dumpify的特点

Dumpify是一款由微软开发的免费调试工具,适用于.NET平台下的程序调试。它的主要特点有:

  1. 支持多种调试方式:Dumpify可以进行线程跟踪、内存快照和堆栈追踪等多种调试方式,帮助开发人员快速定位问题。
  2. 可视化调试结果:Dumpify可以将调试结果以可视化的方式呈现出来,帮助开发人员直观了解程序运行过程中发生的情况。
  3. 支持多种文件格式:Dumpify支持多种文件格式,如.minidump、.tracelog和.snapshot等,可以方便地处理程序的不同调试信息。
  4. 简单易用:Dumpify界面简单,使用方便,即使是初学者也能轻松上手。
  5. 免费开源:Dumpify是一个免费开源的调试工具,没有任何使用限制。开发人员可以自由使用和修改源代码,以满足自己的需要。

🔎3.Dumpify的使用

🦋3.1 匿名类型

匿名类型(Anonymous Types)是C# 3.0中的一个语言特性,可以用于定义一些临时的数据结构,用于临时存储一些值或对象。匿名类型的特点是可以在声明时定义属性,但是类型名字是由编译器隐式生成的,因此无法直接通过代码声明对匿名类型进行操作。

匿名类型常用于临时存储一些查询结果、返回值或临时筛选数据等场景,避免在代码中手动定义一些不必要的类型或结构体。匿名类型的属性可以是值类型、引用类型、集合类型等。

定义匿名类型通常使用对象初始化器的语法,例如:

代码语言:javascript
复制
var person = new { Name = "张三", Age = 20, Gender = "男" };

其中person就是一个匿名类型,编译器会生成一个类似以下的代码:

代码语言:javascript
复制
class AnonymousType
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Gender { get; set; }
}

var person = new AnonymousType { Name = "张三", Age = 20, Gender = "男" };

但是由于类型名字是由编译器生成的,因此无法直接在代码中使用AnonymousType类型名进行操作,只能通过var关键字或object类型进行操作。

Dumpify操作匿名类型:

代码语言:javascript
复制
using Dumpify;

var dot = new
{
    Name = "愚公搬代码",
    Description = "欢迎访问愚公首页:https://blog.csdn.net/aa2528877987?type=blog"
};

dot.Dump();
🦋3.2 嵌套和循环引用

嵌套指的是在一个数据结构里面包含着另一个相同或不同类型的数据结构。比如说一个列表里面可以包含另一个嵌套的列表,或者一个字典里面包含另一个嵌套的字典。

循环引用指的是两个或多个对象之间相互引用,形成一个闭环的引用关系。例如对象A引用B,B又引用A,这样就形成了循环引用。循环引用在内存管理中可能会导致问题,因为当这些对象不再被使用时,它们无法被自动回收,导致内存泄漏。

Dumpify操作嵌套和循环引用:

代码语言:javascript
复制
using Dumpify;

var p1 = new Person
{
    Age = 30,
    Name = "愚公爸爸"
};

var p2 = new Person
{
    Age = 30,
    Name = "愚公儿子"
};

p1.Friend = p2;
p2.Friend = p1;

p1.Dump();
🦋3.3 数组、字典和集合

数组、字典和集合是编程语言中常见的数据结构类型。

数组是具有相同数据类型的有序元素序列,每个元素都有一个唯一的索引,可以通过索引访问和修改元素。

字典是一种无序的键-值存储结构,每个键都唯一对应一个值。通过键可以快速查找对应的值。

集合是由唯一元素组成的集合,与数组和字典不同,它没有顺序,并且每个元素都是唯一的。

在编程中,使用这些数据结构可以方便地组织和处理数据。程序员根据实际需求选择合适的数据结构类型来存储数据,并使用相应的方法操作这些数据。

Dumpify操作组、字典和集合:

代码语言:javascript
复制
using Dumpify;

//数组
var arr = new[] { 1, 2, 3, 4 }.Dump();
//集合
var arr2d = new int[,] { { 1, 2 }, { 3, 4 } }.Dump();
//字典
new Dictionary<string, string>
{
    ["Moaid"] = "Hathot",
    ["Haneeni"] = "Shibli",
    ["Eren"] = "Yeager",
    ["Mikasa"] = "Ackerman",
}.Dump();
🦋3.4 字段和私有成员

在面向对象编程中,一个类通常包含若干个成员,其中包括字段和方法。字段是类中的一个变量,用来存储数据。字段可以是公有的(public),表示可以被外部代码访问和修改;也可以是私有的(private),只能在类内部被访问和修改。

私有成员是指在类的内部使用的成员,不能被外部代码访问和修改。一般情况下,私有成员包括私有字段、私有方法和私有属性(C#中的属性)。私有成员的作用是隐藏类的内部实现细节,使得外部代码不能直接访问和修改内部数据,从而保证程序的正确性和安全性。

可以使用访问修饰符(access modifier)来控制类成员的访问权限。在C#中,常见的访问修饰符包括public(公有)、private(私有)、protected(受保护的)和internal(内部的)。其中,public表示对所有类可见,private表示仅在当前类中可见,protected表示仅在当前类及其派生类中可见,internal表示仅在当前程序集(assembly)中可见。

Dumpify操作字段和私有成员:

代码语言:javascript
复制
using Dumpify;

//包括私有变量打印
new AdditionValue(1, 2).Dump(members: new MembersConfig { IncludeFields = true, IncludeNonPublicMembers = true });

class AdditionValue
{
    private readonly int _a;
    private readonly int _b;

    public AdditionValue(int a, int b)
    {
        _a = a;
        _b = b;
    }

    private int Value => _a + _b;
}
🦋3.5 颜色

自定义颜色指的是在程序中可以自行定义颜色,使用这些自定义颜色可以给程序带来更加独特的视觉效果。在大部分编程语言中,可以通过 RGB或 RGBA颜色码的方式来实现自定义颜色。RGB指的是红、绿、蓝三个分量,范围为0-255,表示颜色的深浅程度。RGBA在RGB基础上增加了一个透明度的分量,范围为0-1,表示颜色的透明程度。

下面是一些常见的语言中自定义颜色的实现方式:

在C#中,可以使用Color结构表示颜色,其中A、R、G、B分别表示透明度、红、绿、蓝分量的值。可以通过Color.FromArgb或Color.FromRgb方法来创建自定义颜色:

代码语言:javascript
复制
Color customColor = Color.FromArgb(255, 50, 100, 150); // 创建自定义颜色,透明度为255,红、绿、蓝分量依次为50、100、150

Dumpify操作自定义颜色:

代码语言:javascript
复制
using Dumpify;
using System.Drawing;

var package = new { Name = "Dumpify", Description = "Dump any object to Console" };
package.Dump(colors: ColorConfig.NoColors);
package.Dump(colors: new ColorConfig { PropertyValueColor = new DumpColor(Color.RoyalBlue) });
🦋3.6 类型名称,标题,标签等

在面向对象编程中,类(class)是一个模板或蓝图,用于创建具有共同属性和方法的对象。因此,类的类型名称、标题和标签等一般都是与该类本身相关的。

  1. 类型名称:类的类型名称一般与该类的名称相同,例如,定义一个名为Person的类,那么该类的类型名称就是Person。
  2. 标题:类的标题可以被认为是类的介绍或描述,一般可以在类的注释中体现。例如,下面是一个Person类的注释示例:
代码语言:javascript
复制
class Person:
  """
  表示一个人的类
  包含姓名、年龄、性别等属性
  """

在这个例子中,注释中的第一行就可以被看作是Person类的标题。

  1. 标签:类的标签一般用于描述类的一些特殊属性或功能。例如,下面是一个Person类的标签示例:
代码语言:javascript
复制
class Person:
  """
  表示一个人的类
  包含姓名、年龄、性别等属性
  
  Attributes:
    name (str): 姓名
    age (int): 年龄
    gender (str): 性别
  """

在这个例子中,标签部分的内容就是用于描述Person类的一些特殊属性,例如姓名、年龄和性别等。

代码语言:javascript
复制
using Dumpify;
using System;

var moaid = new Person { FirstName = "Moaid", LastName = "Hathot", Profession = Profession.Software };
var haneeni = new Person { FirstName = "Haneeni", LastName = "Shibli", Profession = Profession.Health };
moaid.Spouse = haneeni;
haneeni.Spouse = moaid;

moaid.Dump(typeNames: new TypeNamingConfig { ShowTypeNames = false }, tableConfig: new TableConfig { ShowTableHeaders = false });

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Profession { get; set; }
    public Person Spouse { get; set; }
}
public static class Profession
{
    public static string Software { get; set; } = "Profession.Software";
    public static string Health { get; set; } = "Profession.Health";
}
🦋3.7 输出选项(控制台、跟踪、调试、文本)
代码语言:javascript
复制
var package = new { Name = "Dumpify", Description = "Dump any object to Console" };
package.Dump(); //Similar to `package.DumpConsole()` and `package.Dump(output: Outputs.Console))`
package.DumpDebug(); //Dump to Visual Studio's Debug source
package.DumpTrace(); //Dump to Trace 
var text = package.DumpText(); //The table in a text format

using var writer = new StringWriter();
package.Dump(output: new DumpOutput(writer)); //Custom output
🦋3.8 全局配置
代码语言:javascript
复制
using Dumpify;
using System.Drawing;

DumpConfig.Default.TypeNamingConfig.UseAliases = true;
DumpConfig.Default.TypeNamingConfig.ShowTypeNames = true;
DumpConfig.Default.ColorConfig.TypeNameColor = Color.Red;
DumpConfig.Default.MaxDepth = 3;

var package = new
{
    Name = "愚公搬代码",
    Description = "欢迎访问愚公首页:https://blog.csdn.net/aa2528877987?type=blog"
};

package.Dump();
package.DumpDebug();
package.DumpTrace();
var text = package.DumpText();

🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀前言
  • 🚀一、Dumpify
    • 🔎1.安装Dumpify
    • 🔎2.Dumpify的特点
    • 🔎3.Dumpify的使用
      • 🦋3.1 匿名类型
      • 🦋3.2 嵌套和循环引用
      • 🦋3.3 数组、字典和集合
      • 🦋3.4 字段和私有成员
      • 🦋3.5 颜色
      • 🦋3.6 类型名称,标题,标签等
      • 🦋3.7 输出选项(控制台、跟踪、调试、文本)
      • 🦋3.8 全局配置
  • 🚀感谢:给读者的一封信
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档