未验证 提交 df61348e 编写于 作者: P Peter Sollich 提交者: GitHub

Dac changes for regions (#50092)

There are two sets of changes here:

- Make DacHeapWalker work for empty regions - I had observed a crash with the empty regions injected with STRESS_REGIONS.
- Make GetGCHeapStaticData robust against globals saved_sweep_ephemeral_seg and saved_sweep_ephemeral_start being null.

The changes should not cause issues for a coreclr NOT running with regions.
上级 ac98c817
......@@ -6540,17 +6540,20 @@ HRESULT DacHeapWalker::NextSegment()
do
{
mCurrSeg++;
while (mCurrSeg >= mHeaps[mCurrHeap].SegmentCount)
do
{
mCurrSeg = 0;
mCurrHeap++;
if (mCurrHeap >= mHeapCount)
mCurrSeg++;
while (mCurrSeg >= mHeaps[mCurrHeap].SegmentCount)
{
return S_FALSE;
mCurrSeg = 0;
mCurrHeap++;
if (mCurrHeap >= mHeapCount)
{
return S_FALSE;
}
}
}
} while (mHeaps[mCurrHeap].Segments[mCurrSeg].Start >= mHeaps[mCurrHeap].Segments[mCurrSeg].End);
mCurrObj = mHeaps[mCurrHeap].Segments[mCurrSeg].Start;
......@@ -6657,6 +6660,12 @@ HRESULT DacHeapWalker::Reset(CORDB_ADDRESS start, CORDB_ADDRESS end)
mCurrHeap = 0;
mCurrSeg = 0;
HRESULT hr = S_OK;
// it's possible the first segment is empty
if (mCurrObj >= mHeaps[0].Segments[0].End)
hr = MoveToNextObject();
if (!mCache.ReadMT(mCurrObj, &mCurrMT))
return E_FAIL;
......@@ -6664,9 +6673,9 @@ HRESULT DacHeapWalker::Reset(CORDB_ADDRESS start, CORDB_ADDRESS end)
return E_FAIL;
if (mCurrObj < mStart || mCurrObj > mEnd)
MoveToNextObject();
hr = MoveToNextObject();
return S_OK;
return hr;
}
HRESULT DacHeapWalker::ListNearObjects(CORDB_ADDRESS obj, CORDB_ADDRESS *pPrev, CORDB_ADDRESS *pContaining, CORDB_ADDRESS *pNext)
......
......@@ -2786,8 +2786,18 @@ ClrDataAccess::GetGCHeapStaticData(struct DacpGcHeapDetails *detailsData)
detailsData->mark_array = (CLRDATA_ADDRESS)*g_gcDacGlobals->mark_array;
detailsData->current_c_gc_state = (CLRDATA_ADDRESS)*g_gcDacGlobals->current_c_gc_state;
detailsData->next_sweep_obj = (CLRDATA_ADDRESS)*g_gcDacGlobals->next_sweep_obj;
detailsData->saved_sweep_ephemeral_seg = (CLRDATA_ADDRESS)*g_gcDacGlobals->saved_sweep_ephemeral_seg;
detailsData->saved_sweep_ephemeral_start = (CLRDATA_ADDRESS)*g_gcDacGlobals->saved_sweep_ephemeral_start;
if (g_gcDacGlobals->saved_sweep_ephemeral_seg != nullptr)
{
detailsData->saved_sweep_ephemeral_seg = (CLRDATA_ADDRESS)*g_gcDacGlobals->saved_sweep_ephemeral_seg;
detailsData->saved_sweep_ephemeral_start = (CLRDATA_ADDRESS)*g_gcDacGlobals->saved_sweep_ephemeral_start;
}
else
{
// with regions, we don't have these variables anymore
// use special value -1 in saved_sweep_ephemeral_seg to signal the region case
detailsData->saved_sweep_ephemeral_seg = (CLRDATA_ADDRESS)-1;
detailsData->saved_sweep_ephemeral_start = 0;
}
detailsData->background_saved_lowest_address = (CLRDATA_ADDRESS)*g_gcDacGlobals->background_saved_lowest_address;
detailsData->background_saved_highest_address = (CLRDATA_ADDRESS)*g_gcDacGlobals->background_saved_highest_address;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册