値を取得する簡単な方法は、 を使用すること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;