private bool IsComponent(int classID) { PackedNativeType packedNativeType = _snapshot.nativeTypes[classID]; if (packedNativeType.name == "Component") { return(true); } #if UNITY_5_6_OR_NEWER int baseClassID = packedNativeType.nativeBaseTypeArrayIndex; #else int baseClassID = packedNativeType.baseClassId; #endif return(baseClassID != -1 && IsComponent(baseClassID)); }
public static PackedMemorySnapshot LoadSnapshotBin(Stream stream) { System.Reflection.ConstructorInfo ci = typeof(PackedMemorySnapshot).GetConstructor(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic, null, new Type[0], new System.Reflection.ParameterModifier[0]); PackedMemorySnapshot packed = ci.Invoke(null) as PackedMemorySnapshot; BinaryReader br = new BinaryReader(stream); stream.Position += 8; MemUtil.LoadSnapshotProgress(0, "Loading Connection"); float prog = 0; float lastProg = 0; var len = br.ReadInt32(); var connctions = new Connection[len]; System.Reflection.FieldInfo fi = typeof(PackedMemorySnapshot).GetField("m_Connections", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); fi.SetValue(packed, connctions); for (int i = 0; i < len; i++) { Connection c = new Connection(); c.from = br.ReadInt32(); c.to = br.ReadInt32(); prog = ((float)i / len) * 0.15f; if (prog - lastProg > 0.01) { MemUtil.LoadSnapshotProgress(prog, string.Format("Loading Connction {0}/{1}", i + 1, len)); lastProg = prog; } connctions[i] = c; } len = br.ReadInt32(); PackedGCHandle[] handles = new PackedGCHandle[len]; fi = typeof(PackedMemorySnapshot).GetField("m_GcHandles", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); fi.SetValue(packed, handles); System.Reflection.FieldInfo[] fis = new System.Reflection.FieldInfo[] { typeof(PackedGCHandle).GetField("m_Target", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) }; for (int i = 0; i < len; i++) { object h = new PackedGCHandle(); var target = br.ReadUInt64(); fi = fis[0]; fi.SetValue(h, target); prog = 0.15f + ((float)i / len) * 0.15f; if (prog - lastProg > 0.01) { MemUtil.LoadSnapshotProgress(prog, string.Format("Loading GCHandles {0}/{1}", i + 1, len)); lastProg = prog; } handles[i] = (PackedGCHandle)h; } len = br.ReadInt32(); MemorySection[] managedHeap = new MemorySection[len]; fi = typeof(PackedMemorySnapshot).GetField("m_ManagedHeapSections", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); fi.SetValue(packed, managedHeap); fis = new System.Reflection.FieldInfo[] { typeof(MemorySection).GetField("m_Bytes", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(MemorySection).GetField("m_StartAddress", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) }; for (int i = 0; i < len; i++) { object h = new MemorySection(); var bLen = br.ReadInt32(); var bytes = br.ReadBytes(bLen); var startAddress = br.ReadUInt64(); fi = fis[0]; fi.SetValue(h, bytes); fi = fis[1]; fi.SetValue(h, startAddress); prog = 0.3f + ((float)i / len) * 0.15f; if (prog - lastProg > 0.01) { MemUtil.LoadSnapshotProgress(prog, string.Format("Loading Managed Heap {0}/{1}", i + 1, len)); lastProg = prog; } managedHeap[i] = (MemorySection)h; if (managedHeap[i].bytes == null) { UnityEngine.Debug.Log("ff"); } } len = br.ReadInt32(); PackedNativeUnityEngineObject[] nativeObj = new PackedNativeUnityEngineObject[len]; fi = typeof(PackedMemorySnapshot).GetField("m_NativeObjects", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); fi.SetValue(packed, nativeObj); fis = new System.Reflection.FieldInfo[] { typeof(PackedNativeUnityEngineObject).GetField("m_ClassId", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(PackedNativeUnityEngineObject).GetField("m_HideFlags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(PackedNativeUnityEngineObject).GetField("m_InstanceId", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(PackedNativeUnityEngineObject).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(PackedNativeUnityEngineObject).GetField("m_Name", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(PackedNativeUnityEngineObject).GetField("m_NativeObjectAddress", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(PackedNativeUnityEngineObject).GetField("m_Size", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) }; for (int i = 0; i < len; i++) { object obj = new PackedNativeUnityEngineObject(); int clsID = br.ReadInt32(); HideFlags hideFlags = (HideFlags)br.ReadByte(); int instanceID = br.ReadInt32(); var ft = typeof(PackedNativeUnityEngineObject).GetNestedType("ObjectFlags", System.Reflection.BindingFlags.NonPublic); int flags = 0; if (br.ReadBoolean()) { flags |= 1; } if (br.ReadBoolean()) { flags |= 4; } if (br.ReadBoolean()) { flags |= 2; } object flag = Enum.ToObject(ft, flags); string name = null; if (br.ReadBoolean()) { name = br.ReadString(); } long nativeAddress = br.ReadInt64(); int size = br.ReadInt32(); fi = fis[0]; fi.SetValue(obj, clsID); fi = fis[1]; fi.SetValue(obj, hideFlags); fi = fis[2]; fi.SetValue(obj, instanceID); fi = fis[3]; fi.SetValue(obj, flag); fi = fis[4]; fi.SetValue(obj, name); fi = fis[5]; fi.SetValue(obj, nativeAddress); fi = fis[6]; fi.SetValue(obj, size); prog = 0.45f + ((float)i / len) * 0.15f; if (prog - lastProg > 0.01) { MemUtil.LoadSnapshotProgress(prog, string.Format("Loading Native Objects {0}/{1}", i + 1, len)); lastProg = prog; } nativeObj[i] = (PackedNativeUnityEngineObject)obj; } len = br.ReadInt32(); PackedNativeType[] nativeTypes = new PackedNativeType[len]; fi = typeof(PackedMemorySnapshot).GetField("m_NativeTypes", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); fi.SetValue(packed, nativeTypes); fis = new System.Reflection.FieldInfo[] { typeof(PackedNativeType).GetField("m_BaseClassId", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(PackedNativeType).GetField("m_Name", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) }; for (int i = 0; i < len; i++) { object t = new PackedNativeType(); int baseClassId = br.ReadInt32(); string name = null; if (br.ReadBoolean()) { name = br.ReadString(); } fi = fis[0]; fi.SetValue(t, baseClassId); fi = fis[1]; fi.SetValue(t, name); prog = 0.6f + ((float)i / len) * 0.15f; if (prog - lastProg > 0.01) { MemUtil.LoadSnapshotProgress(prog, string.Format("Loading Native Types {0}/{1}", i + 1, len)); lastProg = prog; } nativeTypes[i] = (PackedNativeType)t; } len = br.ReadInt32(); TypeDescription[] typeDesc = new TypeDescription[len]; fi = typeof(PackedMemorySnapshot).GetField("m_TypeDescriptions", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); fi.SetValue(packed, typeDesc); fis = new System.Reflection.FieldInfo[] { typeof(TypeDescription).GetField("m_Assembly", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(TypeDescription).GetField("m_BaseOrElementTypeIndex", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(TypeDescription).GetField("m_Fields", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(TypeDescription).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(TypeDescription).GetField("m_Name", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(TypeDescription).GetField("m_Size", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(TypeDescription).GetField("m_StaticFieldBytes", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(TypeDescription).GetField("m_TypeIndex", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(TypeDescription).GetField("m_TypeInfoAddress", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), }; var fis2 = new System.Reflection.FieldInfo[] { typeof(FieldDescription).GetField("m_IsStatic", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(FieldDescription).GetField("m_Name", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(FieldDescription).GetField("m_Offset", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(FieldDescription).GetField("m_TypeIndex", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), }; for (int i = 0; i < len; i++) { object t = new TypeDescription(); int flags = br.ReadInt32() << 0x10; string assembly = br.ReadString(); int baseOrElementTypeIndex = br.ReadInt32(); int fLen = br.ReadInt32(); FieldDescription[] fields = new FieldDescription[fLen]; for (int j = 0; j < fLen; j++) { object f = new FieldDescription(); bool isStatic = br.ReadBoolean(); string fname = br.ReadString(); int offset = br.ReadInt32(); int ftypeIndex = br.ReadInt32(); fi = fis2[0]; fi.SetValue(f, isStatic); fi = fis2[1]; fi.SetValue(f, fname); fi = fis2[2]; fi.SetValue(f, offset); fi = fis2[3]; fi.SetValue(f, ftypeIndex); fields[j] = (FieldDescription)f; } if (br.ReadBoolean()) { flags |= 2; } if (br.ReadBoolean()) { flags |= 1; } string name = br.ReadString(); int size = br.ReadInt32(); byte[] staticField = br.ReadBytes(br.ReadInt32()); int typeIndex = br.ReadInt32(); ulong typeAddress = br.ReadUInt64(); fi = fis[0]; fi.SetValue(t, assembly); fi = fis[1]; fi.SetValue(t, baseOrElementTypeIndex); fi = fis[2]; fi.SetValue(t, fields); fi = fis[3]; fi.SetValue(t, Enum.ToObject(typeof(TypeDescription).GetNestedType("TypeFlags", System.Reflection.BindingFlags.NonPublic), flags)); fi = fis[4]; fi.SetValue(t, name); fi = fis[5]; fi.SetValue(t, size); fi = fis[6]; fi.SetValue(t, staticField); fi = fis[7]; fi.SetValue(t, typeIndex); fi = fis[8]; fi.SetValue(t, typeAddress); prog = 0.75f + ((float)i / len) * 0.15f; if (prog - lastProg > 0.01) { MemUtil.LoadSnapshotProgress(prog, string.Format("Loading Type Definitions {0}/{1}", i + 1, len)); lastProg = prog; } typeDesc[i] = (TypeDescription)t; } object vminfo = new VirtualMachineInformation(); fis = new System.Reflection.FieldInfo[] { typeof(VirtualMachineInformation).GetField("m_AllocationGranularity", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(VirtualMachineInformation).GetField("m_ArrayBoundsOffsetInHeader", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(VirtualMachineInformation).GetField("m_ArrayHeaderSize", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(VirtualMachineInformation).GetField("m_ArraySizeOffsetInHeader", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(VirtualMachineInformation).GetField("m_ObjectHeaderSize", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), typeof(VirtualMachineInformation).GetField("m_PointerSize", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic), }; fis[0].SetValue(vminfo, br.ReadInt32()); fis[1].SetValue(vminfo, br.ReadInt32()); fis[2].SetValue(vminfo, br.ReadInt32()); fis[3].SetValue(vminfo, br.ReadInt32()); int version = br.ReadInt32(); fis[4].SetValue(vminfo, br.ReadInt32()); fis[5].SetValue(vminfo, br.ReadInt32()); fi = typeof(PackedMemorySnapshot).GetField("m_VirtualMachineInformation", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); fi.SetValue(packed, vminfo); MemUtil.LoadSnapshotProgress(1f, "done"); return(packed); }