Получить примитивное значение с ClrMD

У меня есть следующее

class Test
{
    private MyStruct myStruct;
}

struct MyStruct
{
    private int structValue;
}

Как я могу получить значение structValue?

Я попробовал следующее, но безуспешно

field.GetFieldValue(_address, true\false)
field.GetFieldAddress(_address, true\false)
innerField.Type.GetValue(address)

('field' - это переменная Test, а 'innerField' - это Test.myStruct. Оба типа - ClrInstanceField).

1 ответ

Решение

Самый простой способ получить значение будет использовать ClrType.GetFieldValue,

var testType = heap.GetTypeByName("QuickLab.Test");
ulong testAddress = ...;
int value = (int)testType.GetFieldValue(testAddress, new [] { "myStruct", "structValue" });

тем не мение ClrType.GetFieldValue был сделан устаревшим в последней версии ClrMD (0.8.27). Вот как это сделать с новой версией, обратите внимание, что ClrField.GetFieldValue был переименован ClrField.GetValue,

var testType = heap.GetTypeByName("QuickLab.Test");
var myStructType = heap.GetTypeByName("QuickLab.MyStruct");

var myStructField = testType.GetFieldByName("myStruct");
var structValueField = myStructType.GetFieldByName("structValue");

ulong testAddress = ...;

// Get the address of MyStruct
ulong myStructAddress = myStructField.GetAddress(testAddress);

// Get the value in structValue field, interior = true because we are in a value type
int value = (int)structValueField.GetValue(myStructAddress, interior:true);

Возможно, вы захотите взглянуть на ClrMD.Extensions, это библиотека, разработанная для облегчения использования ClrMD. Вот как это сделать с помощью ClrMD.Extensions.

ClrMDSession session = ClrMDSession.LoadCrashDump(filePath);
ulong testAddress = ...;
var o = session.Heap.GetClrObject(testAddress);
int value = (int)o.Dynamic.myStruct.structValue;
Другие вопросы по тегам