Example #1
0
            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);
                }
            }
Example #2
0
        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));
            }
        }