这是我的课
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();
}
我运行程序并拍摄进程快照。毫不奇怪,这里是我发现的关于我的类的引用。
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。我不确定如何为我的类实例获取这个,所以我所做的是,在gcroot sample的main方法中,添加了以下代码。
foreach (ulong obj2 in heap.EnumerateObjects())
{
ClrType type2 = heap.GetObjectType(obj2);
if (type2.Name.StartsWith("MyNamespace.MyClass") )
obj = obj2;
}
这样我就看到obj得到了一个有效的值,但问题是下面的代码行找不到任何节点,因为总是返回空值。
Node path = FindPathToTarget(heap, root);
因此,我不确定如何从这个转储文件中获得myclass实例的根。如有任何建议,将不胜感激。
最佳答案
clrmd绝对可以用来创建与相同的输出!gcroot,gcroot的示例并没有windbg那么详细!gcroot命令。
在您的例子中,对象“myClass”是一个根(来自主线程的本地变量),示例不返回任何内容。
您可以检查heap.enumerateroots()返回的clrroot,您将找到“myClass”类型的对象。