gpt4 book ai didi

c# - 尝试使用 CLR MD 查找对象根

转载 作者:太空狗 更新时间:2023-10-30 01:17:58 25 4
gpt4 key购买 nike

这是我的课

namespace MyNamespace
{
public class MyClass
{
private byte[] imageBytes = null;

public MyClass() { }

public void LoadImage(string filePath)
{
Image img = Image.FromFile(filePath);
using (MemoryStream mStream = new MemoryStream())
{
img.Save(mStream, img.RawFormat);
imageBytes = mStream.ToArray();
}
}

public void RemoveImage()
{
imageBytes = null;
}
}
}

这就是它的用法

static void Main(string[] args)
{
MyClass mc = new MyClass();

mc.LoadImage(@"C:\Images\myImage.jpg");

Console.WriteLine("take process dump now...");
Console.Read();
mc.RemoveImage();
}

我运行程序并拍下过程快照。毫不奇怪,这是我发现的有关 MyClass 引用的内容。

0:000> !DumpHeap -type MyClass
Address MT Size
0000000002b92e08 000007fe73423a20 24

Statistics:
MT Count TotalSize Class Name
000007fe73423a20 1 24 MyNamespace.MyClass
Total 1 objects
0:000> !GCRoot 0000000002b92e08
Thread 3b3c:
00000000004eef90 000007fe7354011f MyTestApp.Program.Main(System.String[]) [c:\Projects\MyTestApp\Program.cs @ 17]
caller.rsp-30: 00000000004eefb0
-> 0000000002b92e08 MyNamespace.MyClass

Found 1 unique roots (run '!GCRoot -all' to see all roots).

现在我想看看是否可以使用 CLR MD 为存在于同一转储文件中的 MyClass 实例获取相同的根。为此,我使用 GCRoot样本。此应用程序的输入之一是 ulong obj。我不太确定如何为 MyClass 实例获取它,所以我所做的是在 GCRoot 示例的 Main 方法中,我添加了以下代码。

foreach (ulong obj2 in heap.EnumerateObjects())
{
ClrType type2 = heap.GetObjectType(obj2);
if (type2.Name.StartsWith("MyNamespace.MyClass") )
obj = obj2;
}

这样我看到 obj 正在获取一个有效值,但问题是下面的代码行找不到任何节点,因为它总是返回 NULL。

Node path = FindPathToTarget(heap, root);

因此,我不确定如何从这个转储文件中获取 MyClass 实例的根目录。任何建议将不胜感激。

最佳答案

ClrMD 绝对可以用来创建与 !GCRoot 相同的输出,GCRoot 示例不像 windbg !GCRoot 命令那样详细。

在您的例子中,对象“MyClass”是一个根(来自主线程的本地变量)并且示例不返回任何内容。

您可以检查 Heap.EnumerateRoots() 返回的 ClrRoot,您会发现类型为“MyClass”的对象。

关于c# - 尝试使用 CLR MD 查找对象根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29590929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com