Report committed size in eeheap -gc (#1051)
authorSung Yoon Whang <suwhang@microsoft.com>
Sat, 13 Mar 2021 05:27:10 +0000 (21:27 -0800)
committerGitHub <noreply@github.com>
Sat, 13 Mar 2021 05:27:10 +0000 (21:27 -0800)
* cleanup unused field, fix description of GC collection counts in list command

* Fix build

* Add GC segments' committed size to stats reported by eeheap -gc

* show committed size

* Report committed segment and size in eeheap -gc

* Adjust SOS GC test script accordingly

* Add trailing \s+ to script

* Make it report on POH as well

* some more modifications to the test script

* revert incorrect change

* fix x86 build

* Fix POH test script as well

src/SOS/SOS.UnitTests/Scripts/GCPOH.script
src/SOS/SOS.UnitTests/Scripts/GCTests.script
src/SOS/Strike/eeheap.cpp
src/SOS/Strike/strike.cpp
src/SOS/Strike/util.h

index 182a8a7820dcdf9090027c36e846ce8294ec5df3..ea211230abb0dab7a8358805ed29f45221fe82a6 100644 (file)
@@ -57,8 +57,8 @@ VERIFY:\s+Number of GC Heaps:\s+<DECVAL>\s+
 VERIFY:\s+generation\s+<DECVAL>\s+starts\s+at\s+0x<HEXVAL>\s+
 VERIFY:\s+generation\s+<DECVAL>\s+starts\s+at\s+0x<HEXVAL>\s+
 VERIFY:\s+generation\s+<DECVAL>\s+starts\s+at\s+0x<HEXVAL>\s+
-VERIFY:\s+segment\s+begin\s+allocated\s+size\s+
-VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+<HEXVAL>\s+0x<HEXVAL>\(<DECVAL>\)
+VERIFY:\s+segment\s+begin\s+allocated\s+committed\s+allocated\s+size\s+committed\s+size\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+<HEXVAL>\s+<HEXVAL>\s+0x<HEXVAL>\(<DECVAL>\)\s+0x<HEXVAL>\(<DECVAL>\)\s+
 VERIFY:\s+Large object heap starts at 0x<HEXVAL>\s+
 VERIFY:\s+Pinned object heap starts at 0x<HEXVAL>\s+
 
index 68704f177a6ae4690b9ec05f310eac3a235796dc..30fe0c0b395e647fd94f3e5fd314b0fc6bf7e7f0 100644 (file)
@@ -104,8 +104,8 @@ VERIFY:\s+Number of GC Heaps:\s+<DECVAL>\s+
 VERIFY:\s+generation\s+<DECVAL>\s+starts\s+at\s+0x<HEXVAL>\s+
 VERIFY:\s+generation\s+<DECVAL>\s+starts\s+at\s+0x<HEXVAL>\s+
 VERIFY:\s+generation\s+<DECVAL>\s+starts\s+at\s+0x<HEXVAL>\s+
-VERIFY:\s+segment\s+begin\s+allocated\s+size\s+
-VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+<HEXVAL>\s+0x<HEXVAL>\(<DECVAL>\)
+VERIFY:\s+segment\s+begin\s+allocated\s+committed\s+allocated\s+size\s+committed\s+size\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+<HEXVAL>\s+<HEXVAL>\s+0x<HEXVAL>\(<DECVAL>\)\s+0x<HEXVAL>\(<DECVAL>\)\s+
 VERIFY:\s+Large object heap starts at 0x<HEXVAL>\s+
 
 # Continue to the next DebugBreak
index 966f96ce231bed95deeb0ae8007900092901941f..9c1234c833c566480b4401054236a4b77c2cfe14 100644 (file)
@@ -466,13 +466,14 @@ void GCPrintGenerationInfo(const GCHeapDetails &heap)
 }
 
 
-void GCPrintSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_size)
+void GCPrintSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_allocated_size, DWORD_PTR &total_committed_size)
 {
     DWORD_PTR dwAddrSeg;
     DacpHeapSegmentData segment;
 
     dwAddrSeg = (DWORD_PTR)heap.generation_table[GetMaxGeneration()].start_segment;
-    total_size = 0;
+    total_allocated_size = 0;
+    total_committed_size = 0;
     // the loop below will terminate, because we retrieved at most nMaxHeapSegmentCount segments
     while (dwAddrSeg != (DWORD_PTR)heap.generation_table[0].start_segment)
     {
@@ -483,11 +484,15 @@ void GCPrintSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_size)
             ExtOut("Error requesting heap segment %p\n", SOS_PTR(dwAddrSeg));
             return;
         }
-        ExtOut("%p  %p  %p  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE "d)\n", SOS_PTR(dwAddrSeg),
-                 SOS_PTR(segment.mem), SOS_PTR(segment.allocated),
-                 (ULONG_PTR)(segment.allocated - segment.mem),
-                 (ULONG_PTR)(segment.allocated - segment.mem));
-        total_size += (DWORD_PTR) (segment.allocated - segment.mem);
+        ExtOut("%p  %p  %p  %p  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE"d)  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE "d)\n",
+                SOS_PTR(dwAddrSeg),
+                SOS_PTR(segment.mem), SOS_PTR(segment.allocated), SOS_PTR(segment.committed),
+                (ULONG_PTR)(segment.allocated - segment.mem),
+                (ULONG_PTR)(segment.allocated - segment.mem),
+                (ULONG_PTR)(segment.committed - segment.mem),
+                (ULONG_PTR)(segment.committed - segment.mem));
+        total_allocated_size += (DWORD_PTR) (segment.allocated - segment.mem);
+        total_committed_size += (DWORD_PTR) (segment.committed - segment.mem);
         dwAddrSeg = (DWORD_PTR)segment.next;
     }
 
@@ -498,16 +503,19 @@ void GCPrintSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_size)
     }
 
     DWORD_PTR end = (DWORD_PTR)heap.alloc_allocated;
-    ExtOut("%p  %p  %p  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE "d)\n", SOS_PTR(dwAddrSeg),
-             SOS_PTR(segment.mem), SOS_PTR(end),
-             (ULONG_PTR)(end - (DWORD_PTR)segment.mem),
-             (ULONG_PTR)(end - (DWORD_PTR)segment.mem));
-
-    total_size += end - (DWORD_PTR)segment.mem;
-
+    ExtOut("%p  %p  %p  %p  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE"d)  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE "d)\n",
+            SOS_PTR(dwAddrSeg),
+            SOS_PTR(segment.mem), SOS_PTR(end), SOS_PTR(segment.committed),
+            (ULONG_PTR)(end - (DWORD_PTR)segment.mem),
+            (ULONG_PTR)(end - (DWORD_PTR)segment.mem),
+            (ULONG_PTR)(segment.committed - (DWORD_PTR)segment.mem),
+            (ULONG_PTR)(segment.committed - (DWORD_PTR)segment.mem));
+
+    total_allocated_size += end - (DWORD_PTR)segment.mem;
+    total_committed_size += (DWORD_PTR)(segment.committed - segment.mem);
 }
 
-void GCPrintLargeHeapSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_size)
+void GCPrintLargeHeapSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_allocated_size, DWORD_PTR &total_committed_size)
 {
     DWORD_PTR dwAddrSeg;
     DacpHeapSegmentData segment;
@@ -524,22 +532,27 @@ void GCPrintLargeHeapSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_siz
             ExtOut("Error requesting heap segment %p\n", SOS_PTR(dwAddrSeg));
             return;
         }
-        ExtOut("%p  %p  %p  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE "d)\n", SOS_PTR(dwAddrSeg),
-                 SOS_PTR(segment.mem), SOS_PTR(segment.allocated),
-                 (ULONG_PTR)(segment.allocated - segment.mem),
-                 (ULONG_PTR)(segment.allocated - segment.mem));
-        total_size += (DWORD_PTR) (segment.allocated - segment.mem);
+        ExtOut("%p  %p  %p  %p  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE"d)  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE "d)\n",
+                SOS_PTR(dwAddrSeg),
+                SOS_PTR(segment.mem),
+                SOS_PTR(segment.allocated),
+                SOS_PTR(segment.committed),
+                (ULONG_PTR)(segment.allocated - segment.mem),
+                (ULONG_PTR)(segment.allocated - segment.mem),
+                (ULONG_PTR)(segment.committed - segment.mem),
+                (ULONG_PTR)(segment.committed - segment.mem));
+        total_allocated_size += (DWORD_PTR) (segment.allocated - segment.mem);
+        total_committed_size += (DWORD_PTR) (segment.committed - segment.mem);
         dwAddrSeg = (DWORD_PTR)segment.next;
     }
 }
 
-void GCPrintPinnedHeapSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_size)
+void GCPrintPinnedHeapSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_allocated_size, DWORD_PTR total_committed_size)
 {
     DWORD_PTR dwAddrSeg;
     DacpHeapSegmentData segment;
     dwAddrSeg = (DWORD_PTR)heap.generation_table[GetMaxGeneration() + 2].start_segment;
 
-    // total_size = 0;
     // the loop below will terminate, because we retrieved at most nMaxHeapSegmentCount segments
     while (dwAddrSeg != NULL)
     {
@@ -550,31 +563,37 @@ void GCPrintPinnedHeapSegmentInfo(const GCHeapDetails &heap, DWORD_PTR &total_si
             ExtOut("Error requesting heap segment %p\n", SOS_PTR(dwAddrSeg));
             return;
         }
-        ExtOut("%p  %p  %p  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE "d)\n", SOS_PTR(dwAddrSeg),
-                 SOS_PTR(segment.mem), SOS_PTR(segment.allocated),
-                 (ULONG_PTR)(segment.allocated - segment.mem),
-                 (ULONG_PTR)(segment.allocated - segment.mem));
-        total_size += (DWORD_PTR) (segment.allocated - segment.mem);
+        ExtOut("%p  %p  %p  %p  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE"d)  0x%" POINTERSIZE_TYPE "x(%" POINTERSIZE_TYPE "d)\n",
+                SOS_PTR(dwAddrSeg),
+                SOS_PTR(segment.mem),
+                SOS_PTR(segment.allocated),
+                SOS_PTR(segment.committed),
+                (ULONG_PTR)(segment.allocated - segment.mem),
+                (ULONG_PTR)(segment.allocated - segment.mem),
+                (ULONG_PTR)(segment.committed - segment.mem),
+                (ULONG_PTR)(segment.committed - segment.mem));
+        total_allocated_size += (DWORD_PTR) (segment.allocated - segment.mem);
+        total_committed_size += (DWORD_PTR) (segment.committed - segment.mem);
         dwAddrSeg = (DWORD_PTR)segment.next;
     }
 }
 
-void GCHeapInfo(const GCHeapDetails &heap, DWORD_PTR &total_size)
+void GCHeapInfo(const GCHeapDetails &heap, DWORD_PTR &total_allocated_size, DWORD_PTR &total_committed_size)
 {
     GCPrintGenerationInfo(heap);
-    ExtOut("%" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s\n", "segment", "begin", "allocated", "size");
-    GCPrintSegmentInfo(heap, total_size);
+    ExtOut("%" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s\n", "segment", "begin", "allocated", "committed", "allocated size", "committed size");
+    GCPrintSegmentInfo(heap, total_allocated_size, total_committed_size);
 
     ExtOut("Large object heap starts at 0x%p\n",
                   SOS_PTR(heap.generation_table[GetMaxGeneration() + 1].allocation_start));
-    ExtOut("%" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s\n", "segment", "begin", "allocated", "size");
-    GCPrintLargeHeapSegmentInfo(heap, total_size);
+    ExtOut("%" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s  %" POINTERSIZE "s\n", "segment", "begin", "allocated", "committed", "allocated size", "committed size");
+    GCPrintLargeHeapSegmentInfo(heap, total_allocated_size, total_committed_size);
 
     if (heap.has_poh)
     {
         ExtOut("Pinned object heap starts at 0x%p\n",
                       SOS_PTR(heap.generation_table[GetMaxGeneration() + 2].allocation_start));
-        GCPrintPinnedHeapSegmentInfo(heap, total_size);
+        GCPrintPinnedHeapSegmentInfo(heap, total_allocated_size, total_committed_size);
     }
 }
 
@@ -2084,4 +2103,4 @@ DWORD_PTR PrintModuleHeapInfo(__out_ecount(count) DWORD_PTR *moduleList, int cou
         *outWasted += wasted;
 
     return toReturn;
-}
+}
\ No newline at end of file
index 006667b225628993bcb227a58553f510a136d554..d89eecf1d4b5e03b1d8fc693fe67c48f2aa411d9 100644 (file)
@@ -3691,7 +3691,8 @@ DECLARE_API(EEHeap)
         }
 
         ExtOut("Number of GC Heaps: %d\n", dwNHeaps);
-        DWORD_PTR totalSize = 0;
+        DWORD_PTR totalAllocatedSize = 0;
+        DWORD_PTR totalCommittedSize = 0;
         if (!gcheap.bServerMode)
         {
             DacpGcHeapDetails heapDetails;
@@ -3701,9 +3702,11 @@ DECLARE_API(EEHeap)
                 return Status;
             }
 
-            GCHeapInfo (heapDetails, totalSize);
-            ExtOut("Total Size:              ");
-            PrintHeapSize(totalSize, 0);
+            GCHeapInfo (heapDetails, totalAllocatedSize, totalCommittedSize);
+            ExtOut("Total Allocated Size:              ");
+            PrintHeapSize(totalAllocatedSize, 0);
+            ExtOut("Total Committed Size:              ");
+            PrintHeapSize(totalCommittedSize, 0);
         }
         else
         {
@@ -3732,17 +3735,23 @@ DECLARE_API(EEHeap)
                 }
                 ExtOut("------------------------------\n");
                 ExtOut("Heap %d (%p)\n", n, SOS_PTR(heapAddrs[n]));
-                DWORD_PTR heapSize = 0;
+                DWORD_PTR heapAllocSize = 0;
+                DWORD_PTR heapCommitSize = 0;
                 GCHeapDetails heapDetails(dacHeapDetails, heapAddrs[n]);
-                GCHeapInfo (heapDetails, heapSize);
-                totalSize += heapSize;
-                ExtOut("Heap Size:       " WIN86_8SPACES);
-                PrintHeapSize(heapSize, 0);
+                GCHeapInfo (heapDetails, heapAllocSize, heapCommitSize);
+                totalAllocatedSize += heapAllocSize;
+                totalCommittedSize += heapCommitSize;
+                ExtOut("Allocated Heap Size:       " WIN86_8SPACES);
+                PrintHeapSize(heapAllocSize, 0);
+                ExtOut("Committed Heap Size:       " WIN86_8SPACES);
+                PrintHeapSize(heapCommitSize, 0);
             }
         }
         ExtOut("------------------------------\n");
-        ExtOut("GC Heap Size:    " WIN86_8SPACES);
-        PrintHeapSize(totalSize, 0);
+        ExtOut("GC Allocated Heap Size:    " WIN86_8SPACES);
+        PrintHeapSize(totalAllocatedSize, 0);
+        ExtOut("GC Committed Heap Size:    " WIN86_8SPACES);
+        PrintHeapSize(totalCommittedSize, 0);
     }
     return Status;
 }
@@ -16994,4 +17003,4 @@ DECLARE_API(Help)
     }
 
     return S_OK;
-}
+}
\ No newline at end of file
index ea85844fb7711e34b0856a5a57ef456a19a6d6f5..87605bd92e4979c75d201a8125d94eb5861fdc8c 100644 (file)
@@ -2123,7 +2123,7 @@ void GatherOneHeapFinalization(DacpGcHeapDetails& heapDetails, HeapStat *stat, B
 
 CLRDATA_ADDRESS GetAppDomainForMT(CLRDATA_ADDRESS mtPtr);
 CLRDATA_ADDRESS GetAppDomain(CLRDATA_ADDRESS objPtr);
-void GCHeapInfo(const GCHeapDetails &heap, DWORD_PTR &total_size);
+void GCHeapInfo(const GCHeapDetails &heap, DWORD_PTR &total_alloc_size, DWORD_PTR &total_committed_size);
 BOOL GCObjInHeap(TADDR taddrObj, const GCHeapDetails &heap,
     TADDR_SEGINFO& trngSeg, int& gen, TADDR_RANGE& allocCtx, BOOL &bLarge);