0

私は次のものを持っています

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」はテスト変数で、「innerField」は Test.myStruct です。どちらも ClrInstanceField タイプです)。

4

1 に答える 1

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;
于 2015-03-16T17:23:25.560 に答える