public static bool HasReferers(MessageBus msgBus, ClrDump clrDump, IEnumerable<ulong> addresses) { foreach(ulong address in addresses) { if (clrDump.HasReferers(address)) { return true; } } return false; }
public static bool HasReferers(MessageBus msgBus, ClrDump clrDump, IEnumerable <ulong> addresses) { foreach (ulong address in addresses) { if (clrDump.HasReferers(address)) { return(true); } } return(false); }
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); }