コード例 #1
0
 public static bool HasReferers(MessageBus msgBus, ClrDump clrDump, IEnumerable<ulong> addresses)
 {
     foreach(ulong address in addresses) { 
         if (clrDump.HasReferers(address))
         {
             return true;
         }
     }
     return false;
 }
コード例 #2
0
 public static bool HasReferers(MessageBus msgBus, ClrDump clrDump, IEnumerable <ulong> addresses)
 {
     foreach (ulong address in addresses)
     {
         if (clrDump.HasReferers(address))
         {
             return(true);
         }
     }
     return(false);
 }
コード例 #3
0
        public static List <RootPathInformation> AnalyzeRootPath(MessageBus msgBus, ClrDumpObject clrDumpObject)
        {
            ClrDump clrDump = clrDumpObject.ClrDump;
            ulong   address = clrDumpObject.Address;
            CancellationTokenSource token = new CancellationTokenSource();

            msgBus.BeginTask("Analysing Root Path...", token);
            if (token.IsCancellationRequested)
            {
                msgBus.EndTask("Root Path analysis: cancelled.");
                return(null);
            }

            msgBus.Status("Analysing Root Path: collecting root instances...");
            var roots = new HashSet <ulong>(clrDump.EnumerateClrRoots.Select(clrRoot => clrRoot.Object));

            if (logger.IsDebugEnabled)
            {
                logger.Debug("Roots: " + Str(roots));
            }
            List <ulong> bestPath    = null;
            var          currentPath = new List <ulong>();
            bool         result      = FindShortestPath(address, currentPath, ref bestPath, clrDump.GetReferers, roots.Contains, new Dictionary <ulong, List <ulong> >());

            if (!result)
            {
                currentPath = new List <ulong>();
                FindShortestPath(address, currentPath, ref bestPath, clrDump.GetReferers, (addr) => !clrDump.HasReferers(addr), new Dictionary <ulong, List <ulong> >());
            }
            List <RootPathInformation> path = new List <RootPathInformation>();
            ulong prevAddress = address;

            if (bestPath != null)
            {
                foreach (var refAddress in bestPath)
                {
                    var refClrDumpObject = new ClrDumpObject(clrDump, clrDump.GetObjectType(refAddress), refAddress);
                    var fieldName        = refAddress == address ? " - " : clrDump.GetFieldNameReference(prevAddress, refAddress);
                    fieldName = TypeHelpers.RealName(fieldName);
                    path.Add(new RootPathInformation(refClrDumpObject, fieldName));
                    prevAddress = refAddress;
                }
                msgBus.EndTask("Root Path found.");
            }
            else
            {
                msgBus.EndTask("Root Path NOT found.");
            }
            return(path);
        }