Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试使用CLR MD查找对象根_C#_.net_Windbg_Sos_Clrmd - Fatal编程技术网

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

C# 尝试使用CLR MD查找对象根,c#,.net,windbg,sos,clrmd,C#,.net,Windbg,Sos,Clrmd,这是我的班级 namespace MyNamespace { public class MyClass { private byte[] imageBytes = null; public MyClass() { } public void LoadImage(string filePath) { Image img = Image.FromFile(filePath);

这是我的班级

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实例获取相同的根。为此,我使用了示例。此应用程序的一个输入是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”的对象