private static List <object> DiffNative(Dictionary <int, MemObject> native1st, Dictionary <int, MemObject> native2nd) { HashSet <int> both = Intersect(native1st, native2nd); List <object> ret = new List <object>(); foreach (var p in native1st) { if (!both.Contains(p.Key)) { MarkStatus(p.Value, eDiffStatus.Removed); ret.Add(p.Value); } } foreach (var p in native2nd) { if (!both.Contains(p.Key)) { MarkStatus(p.Value, eDiffStatus.Added); ret.Add(p.Value); } } foreach (int i in both) { NativeUnityEngineObject obj1 = native1st[i]._thing as NativeUnityEngineObject; NativeUnityEngineObject obj2 = native2nd[i]._thing as NativeUnityEngineObject; MemObject mo = native2nd[i]; if (obj1.size == obj2.size) { MarkStatus(mo, eDiffStatus.Unchanged); } else if (obj1.size > obj2.size) { MarkStatus(mo, eDiffStatus.Decreased); ret.Add(mo); } else { MarkStatus(mo, eDiffStatus.Increased); ret.Add(mo); } } return(ret); }
void _handleDiffNativeObj(NativeUnityEngineObject nat, string diffType, CrawledMemorySnapshot resultPacked) { var theType = _checkNewTypes(nat, diffType); if (theType == null) { return; } string TypeName = MemUtil.GetGroupName(nat); string diffTypeName = MemUtil.GetCategoryLiteral(nat) + TypeName + diffType; nat.className = diffTypeName; MemObject item = new MemObject(nat, resultPacked); theType.AddObject(item); }
void _handleDiffObj(ThingInMemory thing, string diffType, CrawledMemorySnapshot resultPacked) { var theType = _checkNewTypes(thing, diffType); if (theType == null) { return; } string TypeName = MemUtil.GetGroupName(thing); ThingInMemory newThings = null; if (thing is NativeUnityEngineObject) { var nat = thing as NativeUnityEngineObject; var newNat = new NativeUnityEngineObject(); newNat.caption = thing.caption; newNat.classID = nat.classID; newNat.className = TypeName + diffType; newNat.instanceID = nat.instanceID; newNat.isManager = false; newNat.size = thing.size; newNat.hideFlags = nat.hideFlags; newNat.isPersistent = nat.isPersistent; newNat.name = nat.name; newNat.referencedBy = thing.referencedBy; newNat.references = thing.references; newNat.isDontDestroyOnLoad = nat.isDontDestroyOnLoad; newThings = newNat; } else { var mao = thing as ManagedObject; var newMao = new ManagedObject(); newMao.caption = TypeName + diffType; newMao.address = mao.address; newMao.referencedBy = mao.referencedBy; newMao.references = mao.references; newMao.size = mao.size; newMao.typeDescription = mao.typeDescription; newThings = newMao; } MemObject item = new MemObject(newThings, resultPacked); theType.AddObject(item); }
public void DrawPlainData() { if (_unpackedCrawl != null) { GUILayout.Label(" "); if (GUILayout.Button("Save full list of elements data to an external .txt file")) { string exportPath = EditorUtility.SaveFilePanel("Save Snapshot Info", Application.dataPath, "SnapshotExport.txt", "txt"); if (!String.IsNullOrEmpty(exportPath)) { System.IO.StreamWriter sw = new System.IO.StreamWriter(exportPath); sw.WriteLine("Managed Objects"); for (int i = 0; i < _unpackedCrawl.managedObjects.Length; i++) { ManagedObject managedObject = _unpackedCrawl.managedObjects[i]; sw.WriteLine("Address: " + managedObject.address + ", Caption: " + managedObject.caption + ", Size: " + managedObject.size); } sw.WriteLine("Native Objects"); for (int i = 0; i < _unpackedCrawl.nativeObjects.Length; i++) { NativeUnityEngineObject nativeObject = _unpackedCrawl.nativeObjects[i]; sw.WriteLine("InstanceID: " + nativeObject.instanceID + ", Name: " + nativeObject.name + ", Size: " + nativeObject.size); } sw.Flush(); sw.Close(); } } GUILayout.Label(" "); GUILayout.Label("Managed Objects - First 10 Elements: "); GUILayout.Label(" "); for (int i = 0; i < _unpackedCrawl.managedObjects.Length && i < 10; i++) { ManagedObject managedObject = _unpackedCrawl.managedObjects[i]; GUILayout.Label("Address: " + managedObject.address + ", Caption: " + managedObject.caption + ", Size: " + managedObject.size); } GUILayout.Label(" "); GUILayout.Label("Native Objects - First 10 Elements:"); GUILayout.Label(" "); for (int i = 0; i < _unpackedCrawl.nativeObjects.Length && i < 10; i++) { NativeUnityEngineObject nativeObject = _unpackedCrawl.nativeObjects[i]; GUILayout.Label("InstanceID: " + nativeObject.instanceID + ", Name: " + nativeObject.name + ", Size: " + nativeObject.size); } } }
private IList <MemoryElement> populateData(int numTotalElements) { var treeElements = new List <MemoryElement>(numTotalElements + 1); var root = new MemoryElement("Root", -1, 0, "Root", "Root", 0f); treeElements.Add(root); if (_unpackedCrawl == null) { return(treeElements); } ThingInMemory[] tmp = _unpackedCrawl.allObjects; for (int i = 0; i < numTotalElements; ++i) { if (tmp[i] is NativeUnityEngineObject) { NativeUnityEngineObject nuo = tmp[i] as NativeUnityEngineObject; root = new MemoryElement(nuo.caption, 0, nuo.instanceID, nuo.className, "Native", tmp[i].size); } else if (tmp[i] is ManagedObject) { ManagedObject mo = tmp[i] as ManagedObject; root = new MemoryElement(mo.caption, 0, 0, "Managed", "Managed", mo.size); } else if (tmp[i] is GCHandle) { GCHandle gch = tmp[i] as GCHandle; root = new MemoryElement(gch.caption, 0, 0, "GC Handle", "GC Handle", gch.size); } else if (tmp[i] is StaticFields) { StaticFields sf = tmp[i] as StaticFields; root = new MemoryElement(sf.caption, 0, 0, "GC Handle", sf.typeDescription.name, sf.size); } root.memData = tmp[i]; treeElements.Add(root); } return(treeElements); }
private void DrawSpecificTexture2D(NativeUnityEngineObject nativeObject) { if (nativeObject.className != "Texture2D") { _textureObject = null; return; } if (_prevInstance != nativeObject.instanceID) { _textureObject = EditorUtility.InstanceIDToObject(nativeObject.instanceID) as Texture2D; _prevInstance = nativeObject.instanceID; } if (_textureObject != null) { EditorGUILayout.LabelField("textureInfo: " + _textureObject.width + "x" + _textureObject.height + " " + _textureObject.format); GUILayout.Label(_textureObject, GUILayout.Width(_textureSize), GUILayout.Height(_textureSize * _textureObject.height / _textureObject.width)); } else { EditorGUILayout.LabelField("Can't instance texture,maybe it was already released."); } }
int getNativeObjHashCode(NativeUnityEngineObject nat) { return(nat.instanceID.GetHashCode()); }
public void DrawPlainData() { if (_unpackedCrawl != null) { GUILayout.Label(" "); if (GUILayout.Button("Save managed heap data to an external .csv file", blueColorStyle)) { string exportPath = EditorUtility.SaveFilePanel("Save Snapshot Info", Application.dataPath, "MANAGEDHEAP_SnapshotExport_" + DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss") + ".csv", "csv"); if (!String.IsNullOrEmpty(exportPath)) { System.IO.StreamWriter sw = new System.IO.StreamWriter(exportPath); sw.WriteLine(" Managed Objects , Size , Address "); for (int i = 0; i < _unpackedCrawl.managedHeap.Length; i++) { MemorySection memorySection = _unpackedCrawl.managedHeap[i]; sw.WriteLine("Managed," + memorySection.bytes.Length + "," + memorySection.startAddress); } sw.Flush(); sw.Close(); } } if (GUILayout.Button("Save full list of MANAGED objects data to an external .csv file", blueColorStyle)) { string exportPath = EditorUtility.SaveFilePanel("Save Snapshot Info", Application.dataPath, "MANAGED_SnapshotExport_" + DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss") + ".csv", "csv"); if (!String.IsNullOrEmpty(exportPath)) { m_ManagedGroups.Clear(); System.IO.StreamWriter sw = new System.IO.StreamWriter(exportPath); sw.WriteLine(" Managed Objects , Size , Caption , Type , Number of References (Total), Referenced By (Total), Address "); for (int i = 0; i < _unpackedCrawl.managedObjects.Length; i++) { ManagedObject managedObject = _unpackedCrawl.managedObjects[i]; sw.WriteLine("Managed," + managedObject.size + "," + CleanStrings(managedObject.caption) + "," + CleanStrings(managedObject.typeDescription.name) + "," + managedObject.references.Length + "," + managedObject.referencedBy.Length + "," + managedObject.address); string type = managedObject.typeDescription.name; long size = managedObject.size; ManagedGroupInfo info; if (m_ManagedGroups.TryGetValue(type, out info)) { ++info.Count; info.Size += size; } else { string g = string.Empty; int si = type.IndexOf('.'); if (si > 0) { g = type.Substring(0, si); if (!s_ManagedGroupNames.Contains(g)) { g = string.Empty; } } info = new ManagedGroupInfo { Group = g, Type = type, Count = 1, Size = size }; m_ManagedGroups.Add(type, info); } } sw.Flush(); sw.Close(); string dir = Path.GetDirectoryName(exportPath); string fn = Path.GetFileNameWithoutExtension(exportPath); string gpath = Path.Combine(dir, fn + "_groups.csv"); var lastGroup = "A000000"; using (var outsw = new StreamWriter(gpath)) { outsw.WriteLine("group,type,count,size"); foreach (var pair in m_ManagedGroups) { var info = pair.Value; var g = info.Group; if (!string.IsNullOrEmpty(lastGroup) && string.IsNullOrEmpty(info.Group)) { g = lastGroup + "__"; } if (!string.IsNullOrEmpty(info.Group)) { lastGroup = info.Group; } outsw.WriteLine("{0},\"{1}\",{2},{3}", g, info.Type, info.Count, info.Size); } } string gpath2 = Path.Combine(dir, fn + "_groups_forcmp.csv"); using (var outsw = new StreamWriter(gpath2)) { outsw.WriteLine("type,count,size"); foreach (var pair in m_ManagedGroups) { var info = pair.Value; outsw.WriteLine("\"{0}\",{1},{2}", info.Type, info.Count, info.Size); } } } } if (GUILayout.Button("Save full list of NATIVE objects data to an external .csv file", greenColorStyle)) { string exportPath = EditorUtility.SaveFilePanel("Save Snapshot Info", Application.dataPath, "NATIVE_SnapshotExport_" + DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss") + ".csv", "csv"); if (!String.IsNullOrEmpty(exportPath)) { m_NativeGroups.Clear(); System.IO.StreamWriter sw = new System.IO.StreamWriter(exportPath); sw.WriteLine(" Native Objects , Size , Caption , Class Name , Name , Number of References (Total), Referenced By (Total), InstanceID "); for (int i = 0; i < _unpackedCrawl.nativeObjects.Length; i++) { NativeUnityEngineObject nativeObject = _unpackedCrawl.nativeObjects[i]; sw.WriteLine("Native," + nativeObject.size + "," + CleanStrings(nativeObject.caption) + "," + CleanStrings(nativeObject.className) + "," + CleanStrings(nativeObject.name) + "," + nativeObject.references.Length + "," + nativeObject.referencedBy.Length + "," + nativeObject.instanceID); string type = nativeObject.className; long size = nativeObject.size; NativeGroupInfo info; if (m_NativeGroups.TryGetValue(type, out info)) { ++info.Count; info.Size += size; } else { info = new NativeGroupInfo { Type = type, Count = 1, Size = size }; m_NativeGroups.Add(type, info); } } sw.Flush(); sw.Close(); string dir = Path.GetDirectoryName(exportPath); string fn = Path.GetFileNameWithoutExtension(exportPath); string gpath = Path.Combine(dir, fn + "_groups.csv"); using (var outsw = new StreamWriter(gpath)) { outsw.WriteLine("type,count,size"); foreach (var pair in m_NativeGroups) { var info = pair.Value; outsw.WriteLine("\"{0}\",{1},{2}", info.Type, info.Count, info.Size); } } } } GUILayout.Label(" "); GUILayout.Label("Managed Objects (Total: " + _unpackedCrawl.managedObjects.Length + ") - First 10 Elements: "); GUILayout.Label(" "); for (int i = 0; i < _unpackedCrawl.managedObjects.Length && i < 10; i++) { ManagedObject managedObject = _unpackedCrawl.managedObjects[i]; GUILayout.Label("Address: " + managedObject.address + ", Caption: " + managedObject.caption + ", Size: " + managedObject.size); } GUILayout.Label(" "); GUILayout.Label("Native Objects (Total: " + _unpackedCrawl.nativeObjects.Length + ") - First 10 Elements:"); GUILayout.Label(" "); for (int i = 0; i < _unpackedCrawl.nativeObjects.Length && i < 10; i++) { NativeUnityEngineObject nativeObject = _unpackedCrawl.nativeObjects[i]; GUILayout.Label("InstanceID: " + nativeObject.instanceID + ", Name: " + nativeObject.name + ", Size: " + nativeObject.size); } } }
public void DrawPlainData() { if (_unpackedCrawl != null) { GUILayout.Label(" "); if (GUILayout.Button("Save full list of MANAGED objects data to an external .csv file", blueColorStyle)) { string exportPath = EditorUtility.SaveFilePanel("Save Snapshot Info", Application.dataPath, "MANAGED SnapshotExport (" + DateTime.Now.ToString("dd-MM-yyyy hh-mm-ss") + ").csv", "csv"); if (!String.IsNullOrEmpty(exportPath)) { System.IO.StreamWriter sw = new System.IO.StreamWriter(exportPath); sw.WriteLine(" Managed Objects , Size , Caption , Type , Number of References (Total), Referenced By (Total), Address "); for (int i = 0; i < _unpackedCrawl.managedObjects.Length; i++) { ManagedObject managedObject = _unpackedCrawl.managedObjects[i]; sw.WriteLine("Managed," + managedObject.size + "," + CleanStrings(managedObject.caption) + "," + CleanStrings(managedObject.typeDescription.name) + "," + managedObject.references.Length + "," + managedObject.referencedBy.Length + "," + managedObject.address); } sw.Flush(); sw.Close(); } } if (GUILayout.Button("Save full list of NATIVE objects data to an external .csv file", greenColorStyle)) { string exportPath = EditorUtility.SaveFilePanel("Save Snapshot Info", Application.dataPath, "NATIVE SnapshotExport (" + DateTime.Now.ToString("dd-MM-yyyy hh-mm-ss") + ").csv", "csv"); if (!String.IsNullOrEmpty(exportPath)) { System.IO.StreamWriter sw = new System.IO.StreamWriter(exportPath); sw.WriteLine(" Native Objects , Size , Caption , Class Name , Name , Number of References (Total), Referenced By (Total), InstanceID "); for (int i = 0; i < _unpackedCrawl.nativeObjects.Length; i++) { NativeUnityEngineObject nativeObject = _unpackedCrawl.nativeObjects[i]; sw.WriteLine("Native," + nativeObject.size + "," + CleanStrings(nativeObject.caption) + "," + CleanStrings(nativeObject.className) + "," + CleanStrings(nativeObject.name) + "," + nativeObject.references.Length + "," + nativeObject.referencedBy.Length + "," + nativeObject.instanceID); } sw.Flush(); sw.Close(); } } if (GUILayout.Button("Save full list of All objects data to an external .csv file", redColorStyle)) { string exportPath = EditorUtility.SaveFilePanel("Save Snapshot Info", Application.dataPath, "ALL SnapshotExport (" + DateTime.Now.ToString("dd-MM-yyyy hh-mm-ss") + ").csv", "csv"); if (!String.IsNullOrEmpty(exportPath)) { System.IO.StreamWriter sw = new System.IO.StreamWriter(exportPath); sw.WriteLine(" Object , Size , Caption , Type , Number of References (Total), Referenced By (Total), Address (Managed) or InstanceID (Native) "); for (int i = 0; i < _unpackedCrawl.managedObjects.Length; i++) { ManagedObject managedObject = _unpackedCrawl.managedObjects[i]; sw.WriteLine("Managed," + managedObject.size + "," + CleanStrings(managedObject.caption) + "," + CleanStrings(managedObject.typeDescription.name) + "," + managedObject.references.Length + "," + managedObject.referencedBy.Length + "," + managedObject.address); } for (int i = 0; i < _unpackedCrawl.nativeObjects.Length; i++) { NativeUnityEngineObject nativeObject = _unpackedCrawl.nativeObjects[i]; sw.WriteLine("Native," + nativeObject.size + "," + CleanStrings(nativeObject.caption) + "," + CleanStrings(nativeObject.className) + "," + nativeObject.references.Length + "," + nativeObject.referencedBy.Length + "," + nativeObject.instanceID); } sw.Flush(); sw.Close(); } } GUILayout.Label(" "); GUILayout.Label("Managed Objects (Total: " + _unpackedCrawl.managedObjects.Length + ") - First 10 Elements: "); GUILayout.Label(" "); for (int i = 0; i < _unpackedCrawl.managedObjects.Length && i < 10; i++) { ManagedObject managedObject = _unpackedCrawl.managedObjects[i]; GUILayout.Label("Address: " + managedObject.address + ", Caption: " + managedObject.caption + ", Size: " + managedObject.size); } GUILayout.Label(" "); GUILayout.Label("Native Objects (Total: " + _unpackedCrawl.nativeObjects.Length + ") - First 10 Elements:"); GUILayout.Label(" "); for (int i = 0; i < _unpackedCrawl.nativeObjects.Length && i < 10; i++) { NativeUnityEngineObject nativeObject = _unpackedCrawl.nativeObjects[i]; GUILayout.Label("InstanceID: " + nativeObject.instanceID + ", Name: " + nativeObject.name + ", Size: " + nativeObject.size); } } }