Пример #1
0
//        // 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);
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
        }