使用ClrMD获取原始值

时间:2015-03-12 11:40:21

标签: c# sos sosex 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)

('字段'是测试变量,' innerField'是Test.myStruct。两者都是ClrInstanceField类型。)

1 个答案:

答案 0 :(得分:1)

获取价值的简便方法是使用ClrType.GetFieldValue

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

然而,在最新版本的ClrMD(0.8.27)中,ClrType.GetFieldValue已被淘汰。以下是使用新版本的方法,请注意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;