Skip to content

Commit f363fb9

Browse files
committed
Report FOH segments
1 parent a650a39 commit f363fb9

2 files changed

Lines changed: 56 additions & 0 deletions

File tree

src/coreclr/debug/daccess/dacimpl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,8 @@ class ClrDataAccess
13261326
HRESULT EnumMemDumpAppDomainInfo(CLRDataEnumMemoryFlags flags);
13271327
HRESULT EnumMemDumpAllThreadsStack(CLRDataEnumMemoryFlags flags);
13281328
HRESULT EnumMemCLRMainModuleInfo();
1329+
HRESULT EnumMemCollectFrozenHeap();
1330+
HRESULT EnumMemCollectFrozenSegments(CLRDATA_ADDRESS segment);
13291331

13301332
bool ReportMem(TADDR addr, TSIZE_T size, bool fExpectSuccess = true);
13311333
bool DacUpdateMemoryRegion(TADDR addr, TSIZE_T bufferSize, BYTE* buffer);

src/coreclr/debug/daccess/enummem.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)