Просмотр содержимого и значения переменных в памяти
Я пытаюсь создать инструмент отладки, который будет подключаться к процессу, а затем просматривать содержимое стека и кучи.
До сих пор я использую CLRmd для присоединения к процессу, а затем получаю список типов переменных внутри стека и кучи, но все еще не могу получить значения элементов.
Есть ли способ, с помощью которого я смог бы получить значения? Почему Visual Studio Debugger может это сделать?
Язык не является здесь ограничением.
1 ответ
Я создал следующую программу с пакетом ClrMd NuGet (версия 0.8.31.1) для отображения содержимого объекта, то есть имен полей и значений:
using System;
using System.Diagnostics;
using System.Linq;
using Microsoft.Diagnostics.Runtime;
namespace ClrMdTest
{
class Program
{
static void Main(string[] args)
{
var live = DataTarget.AttachToProcess(
Process.GetProcessesByName("clrmdexampletarget")[0].Id,
1000, AttachFlag.Passive);
var liveClrVersion = live.ClrVersions[0];
var liveRuntime = liveClrVersion.CreateRuntime();
var addresses = liveRuntime.Heap.EnumerateObjectAddresses();
// The where clause does some consistency check for live debugging
// when the GC might cause the heap to be in an inconsistent state.
var singleObjects = from obj in addresses
let type = liveRuntime.Heap.GetObjectType(obj)
where
type != null && !type.IsFree && !string.IsNullOrEmpty(type.Name) &&
type.Name.StartsWith("SomeInterestingNamespace")
select new { Address = obj, Type = type};
foreach (var singleObject in singleObjects)
{
foreach (var field in singleObject.Type.Fields)
{
Console.WriteLine(field.Name + " =");
Console.WriteLine(" " + field.GetValue(singleObject.Address));
}
}
Console.ReadLine();
}
}
}