Update DacHeapWalker to know about POH in SVR mode (#39139)
authorDavid Mason <davmason@microsoft.com>
Sat, 11 Jul 2020 19:03:57 +0000 (12:03 -0700)
committerGitHub <noreply@github.com>
Sat, 11 Jul 2020 19:03:57 +0000 (12:03 -0700)
* add POH for svr

* Use the correct alignment for objects on the POH

src/coreclr/src/debug/daccess/dacdbiimpl.cpp
src/coreclr/src/debug/daccess/request_svr.cpp

index 3bcef88..2f34a59 100644 (file)
@@ -6380,7 +6380,8 @@ bool DacHeapWalker::GetSize(TADDR tMT, size_t &size)
 
         // The size is not guaranteed to be aligned, we have to
         // do that ourself.
-        if (mHeaps[mCurrHeap].Segments[mCurrSeg].Generation == 3)
+        if (mHeaps[mCurrHeap].Segments[mCurrSeg].Generation == 3
+            || mHeaps[mCurrHeap].Segments[mCurrSeg].Generation == 4)
             size = AlignLarge(size);
         else
             size = Align(size);
index e4c2d95..558ac0c 100644 (file)
@@ -274,7 +274,8 @@ HRESULT DacHeapWalker::InitHeapDataSvr(HeapData *&pHeaps, size_t &pCount)
         dac_generation gen0 = *ServerGenerationTableIndex(heap, 0);
         dac_generation gen1 = *ServerGenerationTableIndex(heap, 1);
         dac_generation gen2 = *ServerGenerationTableIndex(heap, 2);
-        dac_generation loh = *ServerGenerationTableIndex(heap, 3);
+        dac_generation loh  = *ServerGenerationTableIndex(heap, 3);
+        dac_generation poh  = *ServerGenerationTableIndex(heap, 4);
 
         pHeaps[i].YoungestGenPtr = (CORDB_ADDRESS)gen0.allocation_context.alloc_ptr;
         pHeaps[i].YoungestGenLimit = (CORDB_ADDRESS)gen0.allocation_context.alloc_limit;
@@ -285,6 +286,7 @@ HRESULT DacHeapWalker::InitHeapDataSvr(HeapData *&pHeaps, size_t &pCount)
 
         // Segments
         int count = GetSegmentCount(loh.start_segment);
+        count += GetSegmentCount(poh.start_segment);
         count += GetSegmentCount(gen2.start_segment);
 
         pHeaps[i].SegmentCount = count;
@@ -313,7 +315,6 @@ HRESULT DacHeapWalker::InitHeapDataSvr(HeapData *&pHeaps, size_t &pCount)
             seg = seg->next;
         }
 
-
         // Large object heap segments
         seg = loh.start_segment;
         for (; seg && (j < count); ++j)
@@ -324,6 +325,17 @@ HRESULT DacHeapWalker::InitHeapDataSvr(HeapData *&pHeaps, size_t &pCount)
 
             seg = seg->next;
         }
+
+        // Pinned object heap segments
+        seg = poh.start_segment;
+        for (; seg && (j < count); ++j)
+        {
+            pHeaps[i].Segments[j].Generation = 4;
+            pHeaps[i].Segments[j].Start = (CORDB_ADDRESS)seg->mem;
+            pHeaps[i].Segments[j].End = (CORDB_ADDRESS)seg->allocated;
+
+            seg = seg->next;
+        }
     }
 
     return S_OK;