Попытка найти корни объекта с помощью CLR MD

Вот мой класс

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).

Теперь я хотел бы посмотреть, смогу ли я получить те же корни для экземпляра MyClass в том же файле дампа, используя CLR MD . Для этого я использую образец GCRoot. Одним из входов в это приложение является ulong obj. Я не совсем уверен, как получить это для экземпляра MyClass, поэтому я добавил, что в методе Main примера GCRoot я добавил следующий код.

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 из этого файла дампа. Любые предложения будут высоко оценены.

1 ответ

Решение

ClrMD определенно можно использовать для создания того же вывода, что и!GCRoot, пример GCRoot не так тщательно разработан, как команда windbg!GCRoot.

В вашем случае объект "MyClass" является корневым (локальная переменная из основного потока), и образец ничего не возвращает.

Вы можете проверить ClrRoot, возвращенный Heap.EnumerateRoots(), и вы найдете свой объект типа "MyClass".

Другие вопросы по тегам