summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike McLaughlin <mikem@microsoft.com>2019-01-07 13:33:29 -0800
committerGitHub <noreply@github.com>2019-01-07 13:33:29 -0800
commit101c99fdfe6c0c348fea615f6388d23a6e397fc6 (patch)
tree371cca717edd7c35c44c70dd0d63054b3f64bb97 /src
parent7d54c590315ad682ed74f9491654720d83532ae7 (diff)
downloadcoreclr-101c99fdfe6c0c348fea615f6388d23a6e397fc6.tar.gz
coreclr-101c99fdfe6c0c348fea615f6388d23a6e397fc6.tar.bz2
coreclr-101c99fdfe6c0c348fea615f6388d23a6e397fc6.zip
Actually fix issue #21484 reported by the customer. (#21850)
GC heap globals like ephemeral_heap_segment and finalize_queue are null/invalid for a server GC. Add a check to skip the workstation GC memory enumeration if server. The server memory enumeration already skips if workstation GC.
Diffstat (limited to 'src')
-rw-r--r--src/debug/daccess/request.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/debug/daccess/request.cpp b/src/debug/daccess/request.cpp
index 24a4c8c350..995cfcab74 100644
--- a/src/debug/daccess/request.cpp
+++ b/src/debug/daccess/request.cpp
@@ -2787,11 +2787,14 @@ ClrDataAccess::GetGCHeapStaticData(struct DacpGcHeapDetails *detailsData)
detailsData->generation_table[i].allocContextLimit = (CLRDATA_ADDRESS)alloc_context->alloc_limit;
}
- DPTR(dac_finalize_queue) fq = Dereference(g_gcDacGlobals->finalize_queue);
- DPTR(uint8_t*) fillPointersTable = dac_cast<TADDR>(fq) + offsetof(dac_finalize_queue, m_FillPointers);
- for (unsigned int i = 0; i<(*g_gcDacGlobals->max_gen + 2 + dac_finalize_queue::ExtraSegCount); i++)
+ if (g_gcDacGlobals->finalize_queue.IsValid())
{
- detailsData->finalization_fill_pointers[i] = (CLRDATA_ADDRESS)*TableIndex(fillPointersTable, i, sizeof(uint8_t*));
+ DPTR(dac_finalize_queue) fq = Dereference(g_gcDacGlobals->finalize_queue);
+ DPTR(uint8_t*) fillPointersTable = dac_cast<TADDR>(fq) + offsetof(dac_finalize_queue, m_FillPointers);
+ for (unsigned int i = 0; i<(*g_gcDacGlobals->max_gen + 2 + dac_finalize_queue::ExtraSegCount); i++)
+ {
+ detailsData->finalization_fill_pointers[i] = (CLRDATA_ADDRESS)*TableIndex(fillPointersTable, i, sizeof(uint8_t*));
+ }
}
SOSDacLeave();
@@ -3760,6 +3763,12 @@ ClrDataAccess::EnumWksGlobalMemoryRegions(CLRDataEnumMemoryFlags flags)
{
SUPPORTS_DAC;
+#ifdef FEATURE_SVR_GC
+ // If server GC, skip enumeration
+ if (g_gcDacGlobals->g_heaps != nullptr)
+ return;
+#endif
+
Dereference(g_gcDacGlobals->ephemeral_heap_segment).EnumMem();
g_gcDacGlobals->alloc_allocated.EnumMem();
g_gcDacGlobals->gc_structures_invalid_cnt.EnumMem();
@@ -3781,7 +3790,6 @@ ClrDataAccess::EnumWksGlobalMemoryRegions(CLRDataEnumMemoryFlags flags)
while (seg)
{
DacEnumMemoryRegion(dac_cast<TADDR>(seg), sizeof(dac_heap_segment));
-
seg = seg->next;
}
}