Пример #1
0
        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);
        }