diff --git a/src/Microsoft.Diagnostics.ExtensionCommands/GCRootCommand.cs b/src/Microsoft.Diagnostics.ExtensionCommands/GCRootCommand.cs index 115a4d1132..bae2b22109 100644 --- a/src/Microsoft.Diagnostics.ExtensionCommands/GCRootCommand.cs +++ b/src/Microsoft.Diagnostics.ExtensionCommands/GCRootCommand.cs @@ -4,6 +4,7 @@ using System; using System.IO; using System.Text; +using System.Collections.Generic; using Microsoft.Diagnostics.DebugServices; using Microsoft.Diagnostics.ExtensionCommands.Output; using Microsoft.Diagnostics.Runtime; @@ -138,6 +139,8 @@ private int PrintOlderGenerationRoots(GCRoot gcroot, int gen, int limit) int count = 0; bool noInternalRootData = true; + HashSet uniqueRoots = new(); + foreach (ClrSubHeap subheap in Runtime.Heap.SubHeaps) { MemoryRange internalRootArray = subheap.InternalRootArray; @@ -159,7 +162,7 @@ private int PrintOlderGenerationRoots(GCRoot gcroot, int gen, int limit) Console.CancellationToken.ThrowIfCancellationRequested(); - if (Memory.ReadPointer(address, out ulong objAddress)) + if (Memory.ReadPointer(address, out ulong objAddress) && !uniqueRoots.Contains(objAddress)) { ClrObject obj = Runtime.Heap.GetObject(objAddress); if (obj.IsValid) @@ -177,6 +180,7 @@ private int PrintOlderGenerationRoots(GCRoot gcroot, int gen, int limit) PrintPath(Console, RootCache, StaticVariables, Runtime.Heap, path); Console.WriteLine(); + uniqueRoots.Add(objAddress); count++; } }