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