public IEnumerable <IClrObject> ExploreFromRoots() { var reader = new ClrObjectReader(); foreach (var root in heap.EnumerateRoots()) { if (root.Object == 0) { continue; } if (!visited.Add(root.Object)) { continue; } if (root.Kind == GCRootKind.Finalizer) { continue; } if (root.Address == 0) { continue; } if (!reader.IsValidObjectType(root.Type)) { continue; } yield return(reader.ReadGCRoot(root)); CollectChildren(root.Type, root.Object); } while (pending.Count > 0) { var address = pending.Pop(); if (!visited.Add(address)) { continue; } var type = heap.GetObjectType(address); if (!reader.IsValidObjectType(type)) { continue; } yield return(reader.ReadFromAddress(type, address)); CollectChildren(type, address); } }
public static IEnumerable <IClrObject> EnumerateAllClrObjects(this ClrHeap heap) { var reader = new ClrObjectReader(); foreach (var address in heap.EnumerateObjectAddresses()) { var type = heap.GetObjectType(address); if (!reader.IsValidObjectType(type)) { continue; } yield return(reader.ReadFromAddress(type, address)); } }