void AssertInt(string fieldName, int value, RichManagedObject managedObject) { var memory = new MemoryReader(m_snapshot); var field = GetField(fieldName, managedObject); Assert.AreEqual(value, memory.ReadInt32((uint)field.offset + managedObject.address)); }
protected override void OnBuildTree(TreeViewItem root) { progress.value = 0; var lookup = new Dictionary <string, AbstractItem>(); var memoryReader = new MemoryReader(m_Snapshot); for (int n = 0, nend = m_Snapshot.managedObjects.Length; n < nend; ++n) { progress.value = (n + 1.0f) / nend; var obj = m_Snapshot.managedObjects[n]; if (obj.address == 0) { continue; // points to null } if (obj.nativeObjectsArrayIndex != -1) { continue; // has a native object, thus can't be an empty shell object } var type = m_Snapshot.managedTypes[obj.managedTypesArrayIndex]; // Only UnityEngine.Object objects can have a m_CachedPtr connection to a native object. if (!type.isUnityEngineObject) { continue; } // Could be an array of an UnityEngine.Object, such as Texture[] if (type.isArray) { continue; } // Get type as a "higher level" representation that is easier to work with var richType = new RichManagedType(m_Snapshot, obj.managedTypesArrayIndex); // Try to get the m_InstanceID field (only exists in editor, not in built players) PackedManagedField packedField; if (richType.FindField("m_InstanceID", out packedField)) { // The editor contains various empty shell objects whose instanceID all contain 0. // I guess it's some kind of special object? In this case we just ignore them. var instanceID = memoryReader.ReadInt32(obj.address + (ulong)packedField.offset); if (instanceID == 0) { continue; } } // Check if we already have a grouping node for that type. // Create a new node if we don't have it. AbstractItem parent; if (!lookup.TryGetValue(type.name, out parent)) { var group = new GroupItem() { id = m_UniqueId++, depth = root.depth + 1, displayName = "" }; group.Initialize(m_Snapshot, type); lookup[type.name] = parent = group; root.AddChild(group); } // Create and add the managed object item var item = new ManagedObjectItem { id = m_UniqueId++, depth = parent.depth + 1, displayName = "" }; item.Initialize(this, m_Snapshot, obj); parent.AddChild(item); m_ManagedObjectCount++; m_ManagedObjectSize += item.size; } progress.value = 1; }