使用 ClrMD 获取原始值
Get primitive value with 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类型。
获取该值的简单方法是使用 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;
我有以下
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类型。
获取该值的简单方法是使用 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;