Beispiel #1
0
        private Dictionary <int, string> GetManagedThreadNames(ClrHeap heap)
        {
            var result = new Dictionary <int, string>();

            if (heap == null || !heap.CanWalkHeap)
            {
                return(result);
            }

            var threadObjects = from obj in heap.EnumerateObjectAddresses()
                                let type = heap.GetObjectType(obj)
                                           where type != null && type.Name == "System.Threading.Thread"
                                           select obj;
            ClrType          threadType     = heap.GetTypeByName("System.Threading.Thread");
            ClrInstanceField nameField      = threadType.GetFieldByName("m_Name");
            ClrInstanceField managedIdField = threadType.GetFieldByName("m_ManagedThreadId");

            foreach (var threadObject in threadObjects)
            {
                string name = (string)nameField.GetValue(threadObject);
                int    id   = (int)managedIdField.GetValue(threadObject);
                result[id] = name;
            }

            return(result);
        }
        public override bool SupportTransformation([ClrObjAndTypeNotEmpty] ClrObject obj)
        {
            if (!obj.Type.Name.StartsWith("System.Collections.Generic.Dictionary<"))
            {
                return(false);
            }


            ClrInstanceField fld = obj.Type.GetFieldByName(entriesFldName);

#if TRACE
            if (fld == null)
            {
                Trace.TraceInformation("{0} object {1} type does not have {2}", obj.Address.ToString("x8"), obj.Type.Name, entriesFldName);
            }
#endif

            return(fld != null);

            /*
             * if (fld == null)
             * return false;
             *
             * var fldVal = obj.GetRefFld(entriesFldName);
             * return !fldVal.IsNullObj;
             */
        }
        public ClrInstanceField GetField(string fieldName)
        {
            ClrInstanceField field = null;
            string           obfuscatedName;

            if (m_deobfuscator.TryObfuscateField(fieldName, out obfuscatedName))
            {
                field = Type.GetFieldByName(obfuscatedName);
            }

            string backingFieldName = GetAutomaticPropertyField(fieldName);

            if (m_deobfuscator.TryObfuscateField(backingFieldName, out obfuscatedName))
            {
                field = Type.GetFieldByName(obfuscatedName);
            }

            if (field == null)
            {
                field = Type.GetFieldByName(fieldName);
            }

            if (field == null)
            {
                field = Type.GetFieldByName(backingFieldName);
            }

            return(field);
        }
Beispiel #4
0
        private void GetThreadEntry(ref List <ClrThread> threads, ClrInstanceField threadId, ClrInstanceField next, ulong curr, bool interior)
        {
            if (curr == 0)
            {
                return;
            }

            int       id     = (int)threadId.GetValue(curr, interior);
            ClrThread thread = GetThreadById(id);

            if (thread != null)
            {
                if (threads == null)
                {
                    threads = new List <ClrThread>();
                }
                threads.Add(thread);
            }

            curr = (ulong)next.GetValue(curr, interior);
            if (curr != 0)
            {
                GetThreadEntry(ref threads, threadId, next, curr, false);
            }
        }
Beispiel #5
0
        public static StructFieldsEx GetStructFields(StructFields sf, ClrType type)
        {
            Debug.Assert(type.IsValueClass);
            var flds = type.Fields;
            var cnt  = flds.Count;

            StructFieldsEx[] structFields = null;
            var types  = new ClrType[cnt];
            var fields = new ClrInstanceField[cnt];

            for (int i = 0; i < cnt; ++i)
            {
                var fld  = flds[i];
                var kind = TypeExtractor.GetElementKind(fld.Type);
                if (TypeExtractor.IsUnknownStruct(kind))
                {
                    fields[i] = fld;
                    types[i]  = fld.Type;
                    if (structFields == null)
                    {
                        structFields = new StructFieldsEx[cnt];
                    }
                    Debug.Assert(sf.Structs[i] != null);
                    structFields[i] = GetStructFields(sf.Structs[i], fld.Type);
                }
                else
                {
                    fields[i] = fld;
                    types[i]  = fld.Type;
                }
            }
            return(new StructFieldsEx(sf, types, fields, structFields));
        }
Beispiel #6
0
        public static object GetFieldValueImpl(ulong address, ClrType type, ClrInstanceField field)
        {
            ClrObject obj        = new ClrObject(address, type);
            var       fieldValue = obj[field];

            return(fieldValue.IsNull ? null : fieldValue.HasSimpleValue?fieldValue.SimpleValue : fieldValue.Address);
        }
Beispiel #7
0
        public void InnerStructSizeTest()
        {
            // https://github.com/microsoft/clrmd/issues/101
            using DataTarget dt      = TestTargets.Types.LoadFullDump();
            using ClrRuntime runtime = dt.ClrVersions.Single().CreateRuntime();

            ClrModule sharedLibrary   = runtime.GetModule("sharedlibrary.dll");
            ClrType   structTestClass = sharedLibrary.GetTypeByName("StructTestClass");
            ClrType   structTest      = sharedLibrary.GetTypeByName("Struct");

            Assert.NotNull(structTest);

            ClrInstanceField field = structTestClass.GetFieldByName("s");

            if (dt.CacheOptions.CacheTypes)
            {
                Assert.Same(structTest, field.Type);
            }
            else
            {
                Assert.Equal(structTest, field.Type);
            }

            Assert.Equal(sizeof(int), field.Size);

            ClrInstanceField nes = structTestClass.GetFieldByName("nes");

            Assert.Equal(0, nes.Size);

            ClrInstanceField es = nes.Type.GetFieldByName("es");

            Assert.Equal(0, es.Size);
        }
Beispiel #8
0
 public static string GetDisplayValue(this ClrInstanceField self, ClrObject clrObject)
 {
     if (self.IsObjectReference)
     {
         var obj = clrObject.GetObjectField(self.Name);
         if (obj.IsNull)
         {
             return("null");
         }
         return($"0x{obj.Address:X} [{obj.Type.Name}:0x{obj.Type.MethodTable:X}]");
     }
     else if (self.HasSimpleValue)
     {
         return(self.GetValue(clrObject.Address).ToString());
     }
     else if (self.IsValueClass)
     {
         var vt = clrObject.GetValueClassField(self.Name);
         return($"0x{vt.Address:X} [struct {vt.Type.Name}:0x{vt.Type.MethodTable:X}]");
     }
     else
     {
         return("<unknown value>");
     }
 }
Beispiel #9
0
        public override ClrType GetRuntimeType(ulong obj)
        {
            if (!IsRuntimeType)
            {
                return(null);
            }

            ClrInstanceField field = GetFieldByName("m_handle");

            if (field == null)
            {
                return(null);
            }

            ulong methodTable = 0;

            if (field.ElementType == ClrElementType.NativeInt)
            {
                methodTable = (ulong)(long)field.GetValue(obj);
            }
            else if (field.ElementType == ClrElementType.Struct)
            {
                ClrInstanceField ptrField = field.Type.GetFieldByName("m_ptr");
                methodTable = (ulong)(long)ptrField.GetValue(field.GetAddress(obj, false), true);
            }

            return(DesktopHeap.GetTypeByMethodTable(methodTable, 0, obj));
        }
Beispiel #10
0
        public unsafe void InternalSetMember(string name, object value)
        {
            ClrInstanceField field = SearchFieldRecursively(Type, name);

            if (field is null)
            {
                throw new ArgumentException($"No such field: {name} in ", nameof(name));
            }

            Type  valueType = value.GetType();
            nuint addr      = field.GetAddress(OffsetBase);

            if (value is ClrObject obj)
            {
                Context.DataAccess.Write(addr, obj.Address);
            }
            else if (value is ClrValue val)
            {
                Context.DataAccess.WriteBytes(addr,
                                              Context.DataAccess.ReadBytes(val.Address, field.Type.BaseSize - 2 * (uint)sizeof(nuint)));
            }
            else if (valueType.IsValueType)
            {
                Context.DataAccess.Write(addr, value);
            }
        }
 public ClrObject this[ClrInstanceField field]
 {
     get
     {
         return(GetInnerObject(field.GetAddress(Address, IsInterior), field.Type));
     }
 }
Beispiel #12
0
        public static object GetFieldValue(ClrHeap heap, ulong address, string fieldName)
        {
            var type = heap.GetObjectType(address);
            ClrInstanceField field = type.GetFieldByName(fieldName);

            return(field?.GetValue(address));
        }
Beispiel #13
0
        public static ulong GetLastObjectInHierarchy(ClrHeap heap, ulong heapobject, string[] hierarchy, int currentIndex)
        {
            ClrType          type  = heap.GetObjectType(heapobject);
            ClrInstanceField field = type.GetFieldByName(hierarchy[currentIndex]);

            if (field == null)
            {
                Console.WriteLine($"ERROR: type '{type.Name}' does not have a field '{hierarchy[currentIndex]}'");
                return(0L);
            }

            ulong fieldValue = (ulong)field.GetValue(heapobject, false, false);

            if (fieldValue == 0)
            {
                Console.WriteLine($"ERROR: the field value for '{hierarchy[currentIndex]}' was null on type '{type.Name}'  ");
                return(0L);
            }

            currentIndex++;
            if (currentIndex == hierarchy.Length)
            {
                return(fieldValue);
            }

            return(GetLastObjectInHierarchy(heap, fieldValue, hierarchy, currentIndex));
        }
Beispiel #14
0
        public static KcpUserAccount GetKcpUserAccountInfo(ulong KcpUserAccountAddr, ClrType KcpUserAccountType, ClrHeap Heap, string databaseLocation)
        {
            KcpUserAccount UserAccountInfo = new KcpUserAccount();

            // Get the embedded ProtectedBinary
            ClrInstanceField KcpProtectedBinaryField   = KcpUserAccountType.GetFieldByName("m_pbKeyData");
            ulong            KcpProtectedBinaryAddr    = KcpProtectedBinaryField.GetAddress(KcpUserAccountAddr);
            ulong            KcpProtectedBinaryObjAddr = (ulong)KcpProtectedBinaryField.GetValue(KcpUserAccountAddr);

            ClrInstanceField EncDataField     = KcpProtectedBinaryField.Type.GetFieldByName("m_pbData");
            ulong            EncDataAddr      = EncDataField.GetAddress(KcpProtectedBinaryObjAddr);
            ulong            EncDataArrayAddr = (ulong)EncDataField.GetValue(KcpProtectedBinaryObjAddr);

            ClrType EncDataArrayType = Heap.GetObjectType(EncDataArrayAddr);
            int     len = EncDataField.Type.GetArrayLength(EncDataArrayAddr);

            if (len <= 0 || len % 16 != 0) // Small sanity check to make sure everything's ok
            {
                return(null);
            }

            byte[] EncData = new byte[len];
            for (int i = 0; i < len; i++)
            {
                EncData[i] = (byte)EncDataArrayType.GetArrayElementValue(EncDataArrayAddr, i);
            }

            UserAccountInfo.databaseLocation     = databaseLocation;
            UserAccountInfo.encryptedBlob        = EncData;
            UserAccountInfo.encryptedBlobAddress = (IntPtr)KcpUserAccountType.GetArrayElementAddress(EncDataArrayAddr, 0);
            UserAccountInfo.encryptedBlobLen     = len;

            return(UserAccountInfo);
        }
Beispiel #15
0
        private DesktopBlockingObject CreateRWSObject(ulong obj, ClrType type)
        {
            if (type == null)
            {
                return(new DesktopBlockingObject(obj, false, 0, null, BlockingReason.None));
            }

            ClrInstanceField field = type.GetFieldByName("writeLockOwnerId");

            if (field != null && field.ElementType == ClrElementType.Int32)
            {
                int       id     = (int)field.GetValue(obj);
                ClrThread thread = GetThreadById(id);
                if (thread != null)
                {
                    return(new DesktopBlockingObject(obj, true, 0, thread, BlockingReason.WriterAcquired));
                }
            }

            field = type.GetFieldByName("upgradeLockOwnerId");
            if (field != null && field.ElementType == ClrElementType.Int32)
            {
                int       id     = (int)field.GetValue(obj);
                ClrThread thread = GetThreadById(id);
                if (thread != null)
                {
                    return(new DesktopBlockingObject(obj, true, 0, thread, BlockingReason.WriterAcquired));
                }
            }

            field = type.GetFieldByName("rwc");
            if (field != null)
            {
                List <ClrThread> threads      = null;
                ulong            rwc          = (ulong)field.GetValue(obj);
                ClrType          rwcArrayType = _heap.GetObjectType(rwc);
                if (rwcArrayType != null && rwcArrayType.IsArray && rwcArrayType.ComponentType != null)
                {
                    ClrType          rwcType  = rwcArrayType.ComponentType;
                    ClrInstanceField threadId = rwcType.GetFieldByName("threadid");
                    ClrInstanceField next     = rwcType.GetFieldByName("next");
                    if (threadId != null && next != null)
                    {
                        int count = rwcArrayType.GetArrayLength(rwc);
                        for (int i = 0; i < count; ++i)
                        {
                            ulong entry = (ulong)rwcArrayType.GetArrayElementValue(rwc, i);
                            GetThreadEntry(ref threads, threadId, next, entry, false);
                        }
                    }
                }

                if (threads != null)
                {
                    return(new DesktopBlockingObject(obj, true, 0, BlockingReason.ReaderAcquired, threads.ToArray()));
                }
            }

            return(new DesktopBlockingObject(obj, false, 0, null, BlockingReason.None));
        }
Beispiel #16
0
        private bool FindThread(ulong start, ulong stop, out ulong threadAddr, out ClrThread target)
        {
            ClrHeap heap = _runtime.Heap;

            foreach (ulong obj in EnumerateObjectsOfType(start, stop, "System.Threading.Thread"))
            {
                ClrType          type          = heap.GetObjectType(obj);
                ClrInstanceField threadIdField = type.GetFieldByName("m_ManagedThreadId");
                if (threadIdField != null && threadIdField.ElementType == ClrElementType.Int32)
                {
                    int       id     = (int)threadIdField.GetValue(obj);
                    ClrThread thread = GetThreadById(id);
                    if (thread != null)
                    {
                        threadAddr = obj;
                        target     = thread;
                        return(true);
                    }
                }
            }

            threadAddr = 0;
            target     = null;
            return(false);
        }
Beispiel #17
0
        private static ulong GetTaskStateFromAddress(ulong address)
        {
            var type = Runtime.Heap.GetObjectType(address);

            if ((type != null) && (type.Name.StartsWith("System.Threading.Task")))
            {
                // try to get the m_stateFlags field value
                ClrInstanceField field = type.GetFieldByName("m_stateFlags");
                if (field != null)
                {
                    var val = field.GetValue(address);
                    if (val != null)
                    {
                        try
                        {
                            return((ulong)(int)val);
                        }
                        catch (InvalidCastException)
                        {
                        }
                    }
                }
            }

            return(0);
        }
        public static TimeSpan Read(ClrObject obj)
        {
            ClrInstanceField dateDataField = obj.Type.GetFieldByName("_ticks");
            var rawDateTimeData            = (long)dateDataField.GetValue(obj.Address, true);
            var ts = new TimeSpan(rawDateTimeData);

            return(ts);
        }
Beispiel #19
0
        public static T GetObjectAs <T>(ClrHeap heap, ulong heapobject, string fieldName)
        {
            ClrType          type  = heap.GetObjectType(heapobject);
            ClrInstanceField field = type.GetFieldByName(fieldName);
            T fieldValue           = (T)field.GetValue(heapobject);

            return(fieldValue);
        }
Beispiel #20
0
 public void SetField(ClrType parent)
 {
     if (parent.Fields != null && _fldIndex >= 0 && _fldIndex < parent.Fields.Count)
     {
         _field = parent.Fields[_fldIndex];
         _kind  = TypeExtractor.GetElementKind(_field.Type);
     }
 }
Beispiel #21
0
        public         ClrObject this[string fieldName]
        {
            get
            {
                ClrInstanceField field = GetField(fieldName);

                return(field == null ? throw new ArgumentException($"Field '{fieldName}' not found in Type '{Type.Name}'") : this[field]);
            }
        }
Beispiel #22
0
        private DesktopBlockingObject CreateRWLObject(ulong obj, ClrType type)
        {
            if (type == null)
            {
                return(new DesktopBlockingObject(obj, false, 0, null, BlockingReason.None));
            }

            ClrInstanceField writerID = type.GetFieldByName("_dwWriterID");

            if (writerID != null && writerID.ElementType == ClrElementType.Int32)
            {
                int id = (int)writerID.GetValue(obj);
                if (id > 0)
                {
                    ClrThread thread = GetThreadById(id);
                    if (thread != null)
                    {
                        return(new DesktopBlockingObject(obj, true, 0, thread, BlockingReason.ReaderAcquired));
                    }
                }
            }

            ClrInstanceField uLock = type.GetFieldByName("_dwULockID");
            ClrInstanceField lLock = type.GetFieldByName("_dwLLockID");

            if (uLock != null && uLock.ElementType == ClrElementType.Int32 && lLock != null && lLock.ElementType == ClrElementType.Int32)
            {
                int uId = (int)uLock.GetValue(obj);
                int lId = (int)lLock.GetValue(obj);


                List <ClrThread> threads = null;
                foreach (ClrThread thread in _runtime.Threads)
                {
                    foreach (IRWLockData l in _runtime.EnumerateLockData(thread.Address))
                    {
                        if (l.LLockID == lId && l.ULockID == uId && l.Level > 0)
                        {
                            if (threads == null)
                            {
                                threads = new List <ClrThread>();
                            }

                            threads.Add(thread);
                            break;
                        }
                    }
                }

                if (threads != null)
                {
                    return(new DesktopBlockingObject(obj, true, 0, BlockingReason.ReaderAcquired, threads.ToArray()));
                }
            }

            return(new DesktopBlockingObject(obj, false, 0, null, BlockingReason.None));
        }
Beispiel #23
0
        private KeyValuePair <string, string?> ReadStringString(
            ulong elementAddress,
            ClrInstanceField keyField,
            ClrInstanceField valueField)
        {
            var key   = keyField.ReadString(elementAddress, true);
            var value = valueField.ReadString(elementAddress, true);

            return(new KeyValuePair <string, string?>(key !, value));
        }
Beispiel #24
0
        private static void CheckField(ClrType type, string fieldName, ClrElementType element, string typeName, int size)
        {
            ClrInstanceField field = type.GetFieldByName(fieldName);

            Assert.NotNull(field);
            Assert.NotNull(field.Type);

            Assert.Equal(element, field.ElementType);
            Assert.Equal(typeName, field.Type.Name);
            Assert.Equal(size, field.Size);
        }
Beispiel #25
0
 public NetFrameworkClrDriver(ClrRuntime runtime) : base(runtime)
 {
     typeTimerQueue      = heap.GetTypeByName("System.Threading.TimerQueue");
     fieldSQueue         = typeTimerQueue.GetStaticFieldByName("s_queue");
     fieldTimers         = typeTimerQueue.GetFieldByName("m_timers");
     typeTimerQueueTimer = heap.GetTypeByName("System.Threading.TimerQueueTimer");
     fieldNext           = typeTimerQueueTimer.GetFieldByName("m_next");
     fieldState          = typeTimerQueueTimer.GetFieldByName("m_state");
     typeMoveNextRunner  = heap.GetTypeByName("System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner");
     fieldStateMachine   = typeMoveNextRunner.GetFieldByName("m_stateMachine");
 }
Beispiel #26
0
        public ClrType GetDictionaryKeyType()
        {
            dynamic          entries = ((dynamic)this).entries;
            ClrInstanceField key     = ((ClrType)entries).ArrayComponentType.GetFieldByName("key");

            if (key == null)
            {
                return(null);
            }

            return(key.Type);
        }
Beispiel #27
0
        public ClrType GetDictionaryValueType()
        {
            dynamic          entries = ((dynamic)this).entries;
            ClrInstanceField value   = ((ClrType)entries).ArrayComponentType.GetFieldByName("value");

            if (value == null)
            {
                return(null);
            }

            return(value.Type);
        }
Beispiel #28
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);
        }
Beispiel #29
0
        private object GetFieldValue(ClrHeap heap, ulong address, string fieldName)
        {
            var type = heap.GetObjectType(address);
            ClrInstanceField field = type.GetFieldByName(fieldName);

            if (field == null)
            {
                return(null);
            }

            return(field.GetValue(address));
        }
Beispiel #30
0
 public override bool GetFieldForOffset(int fieldOffset, bool inner, out ClrInstanceField childField, out int childFieldOffset)
 {
     throw new NotImplementedException();
 }
        private void GetThreadEntry(ref List<ClrThread> threads, ClrInstanceField threadId, ClrInstanceField next, ulong curr, bool interior)
        {
            if (curr == 0)
                return;

            int id = (int)threadId.GetValue(curr, interior);
            ClrThread thread = GetThreadById(id);
            if (thread != null)
            {
                if (threads == null)
                    threads = new List<ClrThread>();
                threads.Add(thread);
            }

            curr = (ulong)next.GetValue(curr, interior);
            if (curr != 0)
                GetThreadEntry(ref threads, threadId, next, curr, false);
        }
Beispiel #32
0
        public override bool GetFieldForOffset(int fieldOffset, bool inner, out ClrInstanceField childField, out int childFieldOffset)
        {
            int ps = (int)DesktopHeap.PointerSize;
            int offset = fieldOffset;

            if (!IsArray)
            {
                if (!inner)
                    offset -= ps;

                foreach (ClrInstanceField field in Fields)
                {
                    if (field.Offset <= offset)
                    {
                        int size = field.Size;

                        if (offset < field.Offset + size)
                        {
                            childField = field;
                            childFieldOffset = offset - field.Offset;
                            return true;
                        }
                    }
                }
            }

            if (BaseType != null)
                return BaseType.GetFieldForOffset(fieldOffset, inner, out childField, out childFieldOffset);

            childField = null;
            childFieldOffset = 0;
            return false;
        }
Beispiel #33
0
 public override bool GetFieldForOffset(int fieldOffset, bool inner, out ClrInstanceField childField, out int childFieldOffset)
 {
     childField = null;
     childFieldOffset = 0;
     return false;
 }
Beispiel #34
-1
        public void GetValue(ClrHeap heap, ulong address, Queue <ValueTuple <TypeValue, ulong> > que)
        {
            que.Clear();
            que.Enqueue((this, address));
            while (que.Count > 0)
            {
                (TypeValue val, ulong addr) = que.Dequeue();
                if (val._type == null)
                {
                    ClrType clrType = heap.GetObjectType(addr);
                    if (clrType == null)
                    {
                        continue;
                    }
                    val._type = clrType;
                    val._kind = TypeExtractor.GetElementKind(clrType);
                    val.SetValue(addr);
                }
                if (val._children != null)
                {
                    for (int i = 0, icnt = val._children.Length; i < icnt; ++i)
                    {
                        TypeValue fldVal = val._children[i];

                        if (fldVal._fieldName != null && fldVal._field == null)
                        {
                            ClrInstanceField f = val._type.GetFieldByName(fldVal._fieldName);
                            if (f == null)
                            {
                                continue;
                            }
                            fldVal._field = f;
                            fldVal._type  = f.Type;
                            fldVal._kind  = TypeExtractor.GetElementKind(f.Type);
                        }
                        object v = ValueExtractor.GetFieldValue(heap, addr, fldVal._type.IsValueClass, fldVal._field, fldVal._kind);
                        ulong  a = (v is ulong) ? (ulong)v : Constants.InvalidAddress;
                        fldVal.SetValue(v);
                        que.Enqueue((val._children[i], (ulong)val._value));
                    }
                }
                else
                {
                    if (val._fieldName != null && val._field == null)
                    {
                        ClrInstanceField f = val._type.GetFieldByName(val._fieldName);
                        val._field = f;
                        val._type  = f.Type;
                        val._kind  = TypeExtractor.GetElementKind(f.Type);
                    }
                    object v = ValueExtractor.GetFieldValue(heap, addr, val._type.IsValueClass, val._field, val._kind);
                    val.SetValue(v);
                }
            }
        }