// // based on https://stackoverflow.com/questions/33290941/how-to-inspect-weakreference-values-with-windbg-sos-and-clrmd // private static readonly ClrType WeakRefType = Heap.GetTypeByName("System.WeakReference"); // private static readonly ClrInstanceField WeakRefHandleField = WeakRefType.GetFieldByName("m_handle"); // private static readonly ClrType IntPtrType = Heap.GetTypeByName("System.IntPtr"); // private static readonly ClrInstanceField IntPtrValueField = IntPtrType.GetFieldByName("m_value"); // // private static ulong GetWeakRefValue(ulong weakRefAddr) // { // var handleAddr = (long) WeakRefHandleField.GetValue(weakRefAddr); // var value = (ulong) IntPtrValueField.GetValue((ulong) handleAddr, true); // // return value; // } // based on https://stackoverflow.com/questions/33290941/how-to-inspect-weakreference-values-with-windbg-sos-and-clrmd public ulong GetWeakRefValue(ClrObject weakRefObject) { var weakRefHandleField = weakRefObject.Type.GetFieldByName("m_handle"); ClrType intPtrType = Heap.GetTypeByName("System.IntPtr"); var valueField = IsCoreRuntime ? "_value" : "m_value"; ClrInstanceField intPtrValueField = intPtrType.GetFieldByName(valueField); var handleAddr = weakRefHandleField.Read <long>(weakRefObject.Address, true); var value = intPtrValueField.Read <ulong>((ulong)handleAddr, true); return(value); }
private KeyValuePair <TKey, TValue> ReadPrimitivePrimitive <TKey, TValue>( ulong elementAddress, ClrInstanceField keyField, ClrInstanceField valueField) where TKey : unmanaged where TValue : unmanaged { var key = keyField.Read <TKey>(elementAddress, true); var value = valueField.Read <TValue>(elementAddress, true); return(new KeyValuePair <TKey, TValue>(key, value)); }
public ClrInstanceField TestFieldNameAndValue <T>(ClrType type, ulong obj, string name, T value) where T : unmanaged { ClrInstanceField field = type.GetFieldByName(name); Assert.NotNull(field); Assert.Equal(name, field.Name); T t = field.Read <T>(obj, interior: false); Assert.Equal(value, t); return(field); }