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(); } }
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()); } }
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(); } }