private void ProcessAllObjectsFromStaticRoots() { // Just to clean up stack traces from debug.Log so easier to read. Application.SetStackTraceLogType(LogType.Log, StackTraceLogType.None); Application.SetStackTraceLogType(LogType.Warning, StackTraceLogType.None); if (m_LoggingOptions == 0) { Debug.LogWarning("No Logging Options Set"); return; } CreateFile(); m_MemberInfoChain.Clear(); m_ScannedObjects.Clear(); m_ScannedStaticMembers.Clear(); m_InvalidTypes.Clear(); m_TotalZombieObjectCount = 0; m_TotalMembersLookedAt = 0; m_TotalScannedStaticMembers = 0; Log("Logging Zombie Objects"); Log(string.Format("Logging Options: {0}{1}IgnoredTypes: {2}{1}ScannedTypes: {3}", m_LoggingOptions.ToString(), Environment.NewLine, string.Join(", ", m_IgnoredTypeStrings), string.Join(", ", m_TypesToScanStrings) )); Assembly assembly = Assembly.GetExecutingAssembly(); Type[] types = assembly.GetTypes(); m_ProgressIncrements = 1.0f / types.Length; m_Progress = 0.0f; foreach (Type type in types) { m_Progress += m_ProgressIncrements; // only care about classes and structs, and valid types. if (!IsValidZombieType(type)) { continue; } // skip types not in includedInitialTypes, if it is non-empty. if (m_TypesToScanStrings.Length > 0) { if (!m_TypesToScanStrings.Contains(type.FullName)) { continue; } } #if UNITY_EDITOR UnityEditor.EditorUtility.DisplayProgressBar("ZombieDetector", " Searching: " + type.FullName.ToString(), m_Progress); #endif m_MemberInfoChain.Clear(); TraverseStaticMembersFromType(type); } if (HasLoggingOptions(LoggingOptions.ListBadEqualsImplementations)) { if (m_InvalidTypes.Count > 0) { Log(string.Format("Bad Implementation of .Equals In Types: {0}{1}{2}", m_InvalidTypes.Count.ToString(), Environment.NewLine, string.Join(Environment.NewLine, m_InvalidTypes.Select(x => x.ToString()).Reverse().ToArray()))); } } if (HasLoggingOptions(LoggingOptions.ListScannedObjects)) { if (m_ScannedObjects.Count > 0) { Log(string.Format("Scanned Objects: {0}{1}{2}", m_ScannedObjects.Count.ToString(), Environment.NewLine, string.Join(Environment.NewLine, m_ScannedObjects.Select(x => x.GetType().ToString()).Reverse().ToArray()))); } } if (HasLoggingOptions(LoggingOptions.ListScannedStaticMembers)) { if (m_ScannedStaticMembers.Count > 0) { Log(string.Format("Scanned Static Members: {0}{1}{2}", m_ScannedStaticMembers.Count.ToString(), Environment.NewLine, FormatStackOfMemberInfo(m_ScannedStaticMembers))); } } #if UNITY_EDITOR UnityEditor.EditorUtility.ClearProgressBar(); #endif Log(string.Format("Scan Complete: Zombie Objects Found:{1}{0}Total Scanned Objects:{2}, Total Scanned Static Members:{3}, Total Members:{4}", Environment.NewLine, m_TotalZombieObjectCount.ToString(), m_ScannedObjects.Count.ToString(), m_TotalScannedStaticMembers.ToString(), m_TotalMembersLookedAt.ToString())); CloseFile(); // Reset the logging type. Application.SetStackTraceLogType(LogType.Log, StackTraceLogType.ScriptOnly); Application.SetStackTraceLogType(LogType.Warning, StackTraceLogType.ScriptOnly); }