#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.
Комментариев нет:
Отправить комментарий