Exemplo n.º 1
0
        void OnGUI()
        {
            var svrGo = GameObject.FindObjectOfType <LuaSvrGameObject>();

            if (svrGo == null)
            {
                GUILayout.Label("There is no LuaSvrGameObject in you scene. Run your game first");
                return;
            }
            if (GUILayout.Button("Capture"))
            {
                System.GC.Collect();
                LuaDLL.lua_gc(svrGo.state.L, LuaGCOptions.LUA_GCCOLLECT, 0);
                _destroyedObjectNames = ObjectCache.GetAlreadyDestroyedObjectNames();
                _allObjectNames       = ObjectCache.GetAllManagedObjectNames();
                cachedDelegateCount   = LuaState.main.cachedDelegateCount;
            }

            GUILayout.Label("LuaDelegate count:" + cachedDelegateCount);
            _showDestroyedObject = EditorGUILayout.Foldout(_showDestroyedObject, "Already Destroyed Unity Object:" + _destroyedObjectNames.Count);
            if (_showDestroyedObject)
            {
                _scrollPos = GUILayout.BeginScrollView(_scrollPos);
                foreach (var name in _destroyedObjectNames)
                {
                    GUILayout.Label(name);
                }
                GUILayout.EndScrollView();
            }

            _showAllObject = EditorGUILayout.Foldout(_showAllObject, "All Managed C# Object:" + _allObjectNames.Count);

            if (_showAllObject)
            {
                _scrollPos2 = GUILayout.BeginScrollView(_scrollPos2);
                foreach (var name in _allObjectNames)
                {
                    GUILayout.Label(name);
                }
                GUILayout.EndScrollView();
            }
        }
Exemplo n.º 2
0
        public static void Capture(bool gcBeforeCapture, Action captureLua)
        {
            Prepare();

            if (gcBeforeCapture)
            {
                LuaDLL.lua_gc(LuaState.main.L, LuaGCOptions.LUA_GCCOLLECT, 0);
                System.GC.Collect();
            }
            if (null != captureLua)
            {
                captureLua();
            }
            Obj2Ints = ObjectCache.GetAllManagedObject2Ints(LuaState.main.L);
            Int2Objs = ObjectCache.GetAllManagedInt2Objects(LuaState.main.L);
            var destroyedObjectNames = ObjectCache.GetAlreadyDestroyedObjectNames(LuaState.main.L);
            var allObjectNames       = ObjectCache.GetAllManagedObjectNames(LuaState.main.L);

            DestroyedObjectNames.Clear();
            foreach (var names in destroyedObjectNames)
            {
                var list = new List <string>();
                for (int i = 0; i < names.Length; ++i)
                {
                    if (i == 0)
                    {
                        list.Add(names[i]);
                    }
                    else
                    {
                        var stack = names[i];
                        var lines = stack.Split(new char[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
                        foreach (var line in lines)
                        {
                            if (!line.Contains("SLua."))
                            {
                                list.Add("\t" + line.Trim());
                            }
                        }
                    }
                }
                DestroyedObjectNames.Add(list.ToArray());
            }
            AddedObjectNames.Clear();
            foreach (var names in allObjectNames)
            {
                if (!m_LastAllObjectNames.Contains(names[0]))
                {
                    var list = new List <string>();
                    for (int i = 0; i < names.Length; ++i)
                    {
                        if (i == 0)
                        {
                            list.Add(names[i]);
                        }
                        else
                        {
                            var stack = names[i];
                            var lines = stack.Split(new char[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
                            foreach (var line in lines)
                            {
                                if (!line.Contains("SLua."))
                                {
                                    list.Add("\t" + line.Trim());
                                }
                            }
                        }
                    }
                    AddedObjectNames.Add(list.ToArray());
                }
            }
            m_LastAllObjectNames.Clear();
            if (null != allObjectNames)
            {
                foreach (var names in allObjectNames)
                {
                    m_LastAllObjectNames.Add(names[0]);
                }
            }
            CachedDelegateCount = LuaState.main.cachedDelegateCount;
            var delegateStackTraces = LuaState.main.GetCachedDelegateStackTraces();

            DelegateStackTraces.Clear();
            foreach (var st in delegateStackTraces)
            {
                var list = new List <string>();
                for (int i = 0; i < st.Length; ++i)
                {
                    if (i == 0)
                    {
                        list.Add(st[i]);
                    }
                    else
                    {
                        var stack = st[i];
                        var lines = stack.Split(new char[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
                        foreach (var line in lines)
                        {
                            if (!line.Contains("SLua."))
                            {
                                list.Add("\t" + line.Trim());
                            }
                        }
                    }
                }
                DelegateStackTraces.Add(list.ToArray());
            }
        }
Exemplo n.º 3
0
        void OnGUI()
        {
            float w     = this.maxSize.x;
            float h     = this.maxSize.y;
            var   svrGo = GameObject.FindObjectOfType <LuaSvrGameObject>();

            if (svrGo == null)
            {
                GUILayout.Label("There is no LuaSvrGameObject in you scene. Run your game first");
                return;
            }
            _includeLuaSnapshot = GUILayout.Toggle(_includeLuaSnapshot, new GUIContent("include lua snapshot"));
            if (GUILayout.Button("Capture"))
            {
                System.GC.Collect();
                LuaDLL.lua_gc(svrGo.state.L, LuaGCOptions.LUA_GCCOLLECT, 0);
                if (_includeLuaSnapshot)
                {
                    CsLibrary.LogicModuleProxy.ScriptProxy.EvalLua("takesnapshot()");
                }
                var destroyedObjectNames = ObjectCache.GetAlreadyDestroyedObjectNames(svrGo.state.L);
                var allObjectNames       = ObjectCache.GetAllManagedObjectNames(svrGo.state.L);
                _destroyedObjectNames.Clear();
                foreach (var names in destroyedObjectNames)
                {
                    var list = new List <string>();
                    for (int i = 0; i < names.Length; ++i)
                    {
                        if (i == 0)
                        {
                            list.Add(names[i]);
                        }
                        else
                        {
                            var stack = names[i];
                            var lines = stack.Split(new char[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
                            foreach (var line in lines)
                            {
                                if (!line.Contains("SLua."))
                                {
                                    list.Add("\t" + line.Trim());
                                }
                            }
                        }
                    }
                    _destroyedObjectNames.Add(list.ToArray());
                }
                _addedObjectNames.Clear();
                foreach (var names in allObjectNames)
                {
                    if (!_lastAllObjectNames.Contains(names[0]))
                    {
                        var list = new List <string>();
                        for (int i = 0; i < names.Length; ++i)
                        {
                            if (i == 0)
                            {
                                list.Add(names[i]);
                            }
                            else
                            {
                                var stack = names[i];
                                var lines = stack.Split(new char[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
                                foreach (var line in lines)
                                {
                                    if (!line.Contains("SLua."))
                                    {
                                        list.Add("\t" + line.Trim());
                                    }
                                }
                            }
                        }
                        _addedObjectNames.Add(list.ToArray());
                    }
                }
                _lastAllObjectNames.Clear();
                if (null != allObjectNames)
                {
                    foreach (var names in allObjectNames)
                    {
                        _lastAllObjectNames.Add(names[0]);
                    }
                }
                _cachedDelegateCount = LuaState.main.cachedDelegateCount;
                var delegateStackTraces = LuaState.main.GetCachedDelegateStackTraces();
                _delegateStackTraces.Clear();
                foreach (var st in delegateStackTraces)
                {
                    var list = new List <string>();
                    for (int i = 0; i < st.Length; ++i)
                    {
                        if (i == 0)
                        {
                            list.Add(st[i]);
                        }
                        else
                        {
                            var stack = st[i];
                            var lines = stack.Split(new char[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
                            foreach (var line in lines)
                            {
                                if (!line.Contains("SLua."))
                                {
                                    list.Add("\t" + line.Trim());
                                }
                            }
                        }
                    }
                    _delegateStackTraces.Add(list.ToArray());
                }
            }

            if (GUILayout.Button("Copy"))
            {
                var sb = new StringBuilder();
                Export(line => { sb.AppendLine(line); });
                GUIUtility.systemCopyBuffer = sb.ToString();
            }
            if (GUILayout.Button("Save"))
            {
                string file = EditorUtility.SaveFilePanel("save result", string.Empty, "luasnapshot", "txt");
                if (!string.IsNullOrEmpty(file))
                {
                    using (var sw = new StreamWriter(file)) {
                        Export(line => { sw.WriteLine(line); });
                        sw.Close();
                    }
                }
            }

            GUILayout.Label("LuaDelegate count:" + _cachedDelegateCount);
            _showDelegateStacks = EditorGUILayout.Foldout(_showDelegateStacks, "Cached Delegate:" + _delegateStackTraces.Count);
            if (_showDelegateStacks)
            {
                _scrollPos0 = GUILayout.BeginScrollView(_scrollPos0, GUILayout.Width(w), GUILayout.Height(240));
                int ct = 0;
                foreach (var stacks in _delegateStackTraces)
                {
                    for (int i = 0; i < stacks.Length; ++i)
                    {
                        GUILayout.Label(stacks[i]);
                    }
                    ++ct;
                    if (ct > 2000)
                    {
                        break;
                    }
                }
                GUILayout.EndScrollView();
            }
            _showDestroyedObject = EditorGUILayout.Foldout(_showDestroyedObject, "Already Destroyed Unity Object:" + _destroyedObjectNames.Count);
            if (_showDestroyedObject)
            {
                _scrollPos1 = GUILayout.BeginScrollView(_scrollPos1, GUILayout.Width(w), GUILayout.Height(240));
                int ct = 0;
                foreach (var names in _destroyedObjectNames)
                {
                    for (int i = 0; i < names.Length; ++i)
                    {
                        GUILayout.Label(names[i]);
                    }
                    ++ct;
                    if (ct > 2000)
                    {
                        break;
                    }
                }
                GUILayout.EndScrollView();
            }

            _showAllObject = EditorGUILayout.Foldout(_showAllObject, "Added Managed C# Object:" + _addedObjectNames.Count);
            if (_showAllObject)
            {
                _scrollPos2 = GUILayout.BeginScrollView(_scrollPos2, GUILayout.Width(w), GUILayout.Height(640));
                int ct = 0;
                foreach (var names in _addedObjectNames)
                {
                    for (int i = 0; i < names.Length; ++i)
                    {
                        GUILayout.Label(names[i]);
                    }
                    ++ct;
                    if (ct > 2000)
                    {
                        break;
                    }
                }
                GUILayout.EndScrollView();
            }
        }