@@ -345,6 +345,9 @@ HRESULT ClrDataAccess::EnumMemoryRegionsWorkerHeap(IN CLRDataEnumMemoryFlags fla
345345 // Dump the Debugger object data needed
346346 CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED ( g_pDebugger->EnumMemoryRegions (flags); )
347347
348+ // Dump the frozen segments
349+ CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED ( status = EnumMemCollectFrozenHeap (); );
350+
348351 // now dump the memory get dragged in by using DAC API implicitly.
349352 m_dumpStats.m_cbImplicitly = m_instances.DumpAllInstances (m_enumMemCb);
350353
@@ -1582,6 +1585,57 @@ HRESULT ClrDataAccess::EnumMemCLRMainModuleInfo()
15821585 return status;
15831586}
15841587
1588+ HRESULT ClrDataAccess::EnumMemCollectFrozenHeap ()
1589+ {
1590+ SUPPORTS_DAC;
1591+
1592+ HRESULT hr = S_OK;
1593+
1594+ struct DacpGcHeapData heap;
1595+ IfFailRet (GetGCHeapData (&heap));
1596+ if (heap.bServerMode )
1597+ {
1598+ unsigned int heapCount = GCHeapCount ();
1599+ CLRDATA_ADDRESS* heaps = (CLRDATA_ADDRESS*)alloca (heapCount * sizeof (CLRDATA_ADDRESS*));
1600+ IfFailRet (GetServerHeaps (heaps, m_pTarget));
1601+ for (unsigned int heapNum = 0 ; heapNum < heapCount; heapNum++)
1602+ {
1603+ struct DacpGcHeapDetails heap_detail;
1604+ IfFailRet (ServerGCHeapDetails (heaps[heapNum], &heap_detail));
1605+ IfFailRet (EnumMemCollectFrozenSegments (heap_detail.generation_table [2 ].start_segment ));
1606+ }
1607+ }
1608+ else
1609+ {
1610+ struct DacpGcHeapDetails heap_detail;
1611+ IfFailRet (GetGCHeapStaticData (&heap_detail));
1612+ IfFailRet (EnumMemCollectFrozenSegments (heap_detail.generation_table [2 ].start_segment ));
1613+ }
1614+
1615+ return hr;
1616+ }
1617+
1618+ HRESULT ClrDataAccess::EnumMemCollectFrozenSegments (CLRDATA_ADDRESS segment)
1619+ {
1620+ SUPPORTS_DAC;
1621+
1622+ HRESULT hr = S_OK;
1623+
1624+ const size_t heap_segment_flags_readonly = 1 ;
1625+
1626+ while (segment)
1627+ {
1628+ struct DacpHeapSegmentData heap_segment;
1629+ IfFailRet (GetHeapSegmentData (segment, &heap_segment));
1630+ if (heap_segment.flags & heap_segment_flags_readonly)
1631+ {
1632+ ReportMem ((TADDR)heap_segment.mem , (TSIZE_T)(heap_segment.allocated - heap_segment.mem ));
1633+ }
1634+ segment = heap_segment.next ;
1635+ }
1636+
1637+ return hr;
1638+ }
15851639
15861640// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15871641//
0 commit comments