Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

C#: построение дерево объектов выгруженных в память объектов

#c_sharp #рефлексия


Добрый день.

Сегодня загорелся таким вопросом: если приложение (например win-сервис) используется
в своей работе какие-то экземпляры классов, то значит они где-то хранятся, а значит
можно получить их перечень.

Можно ли как-то с помощью C# узнать, какие объекты выгружены в память, в каком кол-ве,
владельцем которых есть конкретный виндовс-сервис?
Это я планирую сделать нечто вроде профайлера.

Спасибо.
    


Ответы

Ответ 1



Попробуйте компонент CLR Memory Diagnostics (ClrMD): int pid = Process.GetProcessesByName("HelloWorld")[0].Id; using (DataTarget dataTarget = DataTarget.AttachToProcess(pid, 5000)) { string dacLocation = dataTarget.ClrVersions[0].TryGetDacLocation(); ClrRuntime runtime = dataTarget.CreateRuntime(dacLocation); ClrHeap heap = runtime.GetHeap(); foreach (ulong obj in heap.EnumerateObjects()) { ClrType type = heap.GetObjectType(obj); ulong size = type.GetSize(obj); Console.WriteLine("{0,12:X} {1,8:n0} {2}", obj, size, type.Name); } } Вывод: 23B1D30 36 System.Security.PermissionSet 23B1D54 20 Microsoft.Win32.SafeHandles.SafePEFileHandle 23B1D68 32 System.Security.Policy.PEFileEvidenceFactory 23B1D88 40 System.Security.Policy.Evidence Более подробно можно почитать в статье .NET Crash Dump and Live Process Inspection. Конкретные сценарии работы с ClrMD можно найти в официальном репозитории. Плюс стоит обратить внимание на ClrMD.Extensions, которая несколько облегчает работу с ClrMD. С помощью этого компонента можно также анализировать файлы дампа. В случае, если вы умеете работать с unmanaged кодом, более правильно будет воспользоваться Profiling API.

Комментариев нет:

Отправить комментарий