.net - 计算对象的大小,使其包括其所有子对象的大小和(孙子链)

标签 .net size windbg sos sosex

假设类 A 包含 B 和 C 的实例。B 包含 D、E 和 F,而 C 包含 G、H 和 I 的实例。因此,在计算 A 的大小时,我想包括其所有实例的大小及其子项目。当我使用 !dumpheap -stats 命令时,A 的大小似乎并不包括其所有包含的子代、孙子代、孙孙代子。

有什么方法可以在windbg中以这种方式获取A的大小吗?

最佳答案

我认为

!objsize <object address>

这就是您要找的。

但是,它仅适用于单个对象( !dumpheap -stat 总结所有对象,但不包括在内)。如果您想对该类型的所有对象执行此操作,则需要 !dumpheap -short -type和一个循环。

针对 Marc Sherman 的评论:

According to the doc !objsize gets the size of the parent and its children, it doesn't mention grand-children and beyond: "The ObjSize command includes the size of all child objects in addition to the parent."

!dumpheap不考虑 child :

0:006> !dumpheap -mt 02b24dfc
 Address       MT     Size
02e92410 02b24dfc       28     
02e9242c 02b24dfc       28     
02e92474 02b24dfc       28    
[...]

但是!objsize是:

0:006> !objsize 02e92410
sizeof(02e92410) = 28 (0x1c) bytes (ObjSizeChildren.Object)
0:006> !objsize 02e9242c
sizeof(02e9242c) = 72 (0x48) bytes (ObjSizeChildren.Object)
0:006> !objsize 02e92474
sizeof(02e92474) = 160 (0xa0) bytes (ObjSizeChildren.Object)

用此代码检查:

class Program
{
    static void Main()
    {
        var o1 = new Object();
        var o2 = new Object {child = new Child()};
        var o3 = new Object {child = new Child {grandChild = new GrandChild()}};
        Console.WriteLine("Debug now");
        Console.ReadLine();
        Console.Write(o1);
        Console.Write(o2);
        Console.Write(o3);
    }
}

class Object
{
    private long a;
    private long b;
    public Child child;
}

internal class Child
{
    private long a;
    private long b;
    private long c;
    private long d;
    public GrandChild grandChild;
}

internal class GrandChild
{
    private long a;
    private long b;
    private long c;
    private long d;
    private long e;
    private long f;
    private long g;
    private long h;
    private long i;
    private long j;
}

关于.net - 计算对象的大小,使其包括其所有子对象的大小和(孙子链),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28845244/

相关文章:

c# - 使用 Visual Studio 事后调试 C# 应用程序

c# - 如何保留/存储我的 Azure 凭据?

c# - 在 Entity Framework Core 中编写实体 POCO 类的正确方法是什么?

c# - 如何将 SecureString 转换为 System.String?

javascript - 优化 Javascript 中所有英语单词集合大小的最有效方法是什么?

在所有其他大小都合适后,构建大小为 520010 的 float 组会使我的代码崩溃

c# - 回滚后ExecuteNonQuery的返回值

c# - 在 Winform 应用程序中更改组合框的高度

windows - 我如何计算出在内核调试 session 中使用 WinDBG 等待的事件

kernel - 如何使用 WinDbg 创建内核转储