Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update the StubManager for better debugger stepping. #65947

Merged
merged 13 commits into from
Mar 4, 2022
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 0 additions & 47 deletions src/coreclr/debug/daccess/fntableaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,30 +100,6 @@ struct FakeStubUnwindInfoHeapSegment
FakeStubUnwindInfoHeapSegment *pNext;
};

#define FAKE_STUB_EXTERNAL_ENTRY_BIT 0x40000000
#define FAKE_STUB_UNWIND_INFO_BIT 0x08000000

#ifdef _DEBUG
#define FAKE_STUB_SIGNATURE 0x42555453
#endif

struct FakeStub
{
ULONG m_refcount;
ULONG m_patchOffset;

UINT m_numCodeBytes;
#ifdef _DEBUG
UINT32 m_signature;
#else
#ifdef HOST_64BIT
//README ALIGNMENT: in retail mode UINT m_numCodeBytes does not align to 16byte for the code
// after the Stub struct. This is to pad properly
UINT m_pad_code_bytes;
#endif // HOST_64BIT
#endif // _DEBUG
};

#endif // DEBUGSUPPORT_STUBS_HAVE_UNWIND_INFO


Expand Down Expand Up @@ -166,32 +142,9 @@ class CheckDuplicatedStructLayouts
CHECK_OFFSET(StubUnwindInfoHeapSegment, pUnwindHeaderList);
CHECK_OFFSET(StubUnwindInfoHeapSegment, pNext);


CHECK_OFFSET(Stub, m_refcount);
CHECK_OFFSET(Stub, m_patchOffset);
CHECK_OFFSET(Stub, m_numCodeBytes);
#ifdef _DEBUG
CHECK_OFFSET(Stub, m_signature);
#endif // _DEBUG

#endif // DEBUGSUPPORT_STUBS_HAVE_UNWIND_INFO

#undef CHECK_OFFSET

#ifdef DEBUGSUPPORT_STUBS_HAVE_UNWIND_INFO

static_assert_no_msg( Stub::EXTERNAL_ENTRY_BIT
== FAKE_STUB_EXTERNAL_ENTRY_BIT);

static_assert_no_msg( Stub::UNWIND_INFO_BIT
== FAKE_STUB_UNWIND_INFO_BIT);

#ifdef _DEBUG
static_assert_no_msg( FAKE_STUB_SIGNATURE
== Stub::kUsedStub);
#endif

#endif // DEBUGSUPPORT_STUBS_HAVE_UNWIND_INFO
};

#ifdef DEBUGSUPPORT_STUBS_HAVE_UNWIND_INFO
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/debug/ee/amd64/amd64walker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ void NativeWalker::Decode()

BYTE rex = NULL;

LOG((LF_CORDB, LL_INFO100000, "NW:Decode: m_ip 0x%x\n", m_ip));
LOG((LF_CORDB, LL_INFO100000, "NW:Decode: m_ip 0x%p\n", m_ip));

BYTE prefix = *ip;
if (prefix == 0xcc)
Expand Down Expand Up @@ -103,7 +103,7 @@ void NativeWalker::Decode()
// Read the opcode
m_opcode = *ip++;

LOG((LF_CORDB, LL_INFO100000, "NW:Decode: ip 0x%x, m_opcode:%0.2x\n", ip, m_opcode));
LOG((LF_CORDB, LL_INFO100000, "NW:Decode: ip 0x%p, m_opcode:%0.2x\n", ip, m_opcode));
AaronRobinsonMSFT marked this conversation as resolved.
Show resolved Hide resolved

// Don't remove this, when we did the check above for the prefix we didn't modify the codestream
// and since m_opcode was just taken directly from the code stream it will be patched if we
Expand Down
55 changes: 26 additions & 29 deletions src/coreclr/debug/ee/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -592,8 +592,8 @@ DebuggerControllerPatch *DebuggerPatchTable::AddPatchForAddress(DebuggerControll

_ASSERTE(kind == PATCH_KIND_NATIVE_MANAGED || kind == PATCH_KIND_NATIVE_UNMANAGED);
LOG((LF_CORDB,LL_INFO10000,"DCP:AddPatchForAddress bound "
"absolute to 0x%x with dji 0x%x (mdDef:0x%x) "
"controller:0x%x AD:0x%x\n",
"absolute to 0x%p with dji 0x%p (mdDef:0x%x) "
"controller:0x%p AD:0x%p\n",
address, dji, (fd!=NULL?fd->GetMemberDef():0), controller,
pAppDomain));

Expand Down Expand Up @@ -2094,7 +2094,7 @@ BOOL DebuggerController::AddBindAndActivatePatchForMethodDesc(MethodDesc *fd,
ControllerLockHolder ch;

LOG((LF_CORDB|LF_ENC,LL_INFO10000,"DC::AP: Add to %s::%s, at offs 0x%x "
"fp:0x%x AD:0x%x\n", fd->m_pszDebugClassName,
"fp:0x%p AD:0x%p\n", fd->m_pszDebugClassName,
fd->m_pszDebugMethodName,
nativeOffset, fp.GetSPValue(), pAppDomain));

Expand Down Expand Up @@ -3222,7 +3222,7 @@ void DebuggerController::DisableSingleStep()
//
void DebuggerController::ApplyTraceFlag(Thread *thread)
{
LOG((LF_CORDB,LL_INFO1000, "DC::ApplyTraceFlag thread:0x%x [0x%0x]\n", thread, Debugger::GetThreadIdHelper(thread)));
LOG((LF_CORDB,LL_INFO1000, "DC::ApplyTraceFlag thread:0x%p [0x%0x]\n", thread, Debugger::GetThreadIdHelper(thread)));

CONTEXT *context;
if(thread->GetInteropDebuggingHijacked())
Expand All @@ -3241,7 +3241,6 @@ void DebuggerController::ApplyTraceFlag(Thread *thread)
LOG((LF_CORDB,LL_INFO1000, "DC::ApplyTraceFlag marked thread for debug stepping\n"));

SetSSFlag(reinterpret_cast<DT_CONTEXT *>(context) ARM_ARG(thread) ARM64_ARG(thread));
LOG((LF_CORDB,LL_INFO1000, "DC::ApplyTraceFlag Leaving, baby!\n"));
}

//
Expand All @@ -3251,7 +3250,7 @@ void DebuggerController::ApplyTraceFlag(Thread *thread)

void DebuggerController::UnapplyTraceFlag(Thread *thread)
{
LOG((LF_CORDB,LL_INFO1000, "DC::UnapplyTraceFlag thread:0x%x\n", thread));
LOG((LF_CORDB,LL_INFO1000, "DC::UnapplyTraceFlag thread:0x%p\n", thread));


// Either this is the helper thread, or we're manipulating our own context.
Expand Down Expand Up @@ -5107,7 +5106,7 @@ bool DebuggerStepper::ShouldContinueStep( ControllerStackInfo *info,

bool DebuggerStepper::IsRangeAppropriate(ControllerStackInfo *info)
{
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: info:0x%x \n", info));
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: info:0x%p \n", info));
if (m_range == NULL)
{
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: m_range == NULL, returning FALSE\n"));
Expand All @@ -5129,8 +5128,8 @@ bool DebuggerStepper::IsRangeAppropriate(ControllerStackInfo *info)
realFrame = &(info->m_activeFrame);
}

LOG((LF_CORDB,LL_INFO10000, "DS::IRA: info->m_activeFrame.fp:0x%x m_fp:0x%x\n", info->m_activeFrame.fp, m_fp));
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: m_fdException:0x%x realFrame->md:0x%x realFrame->fp:0x%x m_fpException:0x%x\n",
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: info->m_activeFrame.fp:0x%p m_fp:0x%p\n", info->m_activeFrame.fp, m_fp));
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: m_fdException:0x%p realFrame->md:0x%p realFrame->fp:0x%p m_fpException:0x%p\n",
m_fdException, realFrame->md, realFrame->fp, m_fpException));
if ( (info->m_activeFrame.fp == m_fp) ||
( (m_fdException != NULL) && (realFrame->md == m_fdException) &&
Expand Down Expand Up @@ -5179,7 +5178,7 @@ bool DebuggerStepper::IsRangeAppropriate(ControllerStackInfo *info)
bool DebuggerStepper::IsInRange(SIZE_T ip, COR_DEBUG_STEP_RANGE *range, SIZE_T rangeCount,
ControllerStackInfo *pInfo)
{
LOG((LF_CORDB,LL_INFO10000,"DS::IIR: off=0x%x\n", ip));
LOG((LF_CORDB,LL_INFO10000,"DS::IIR: off=0x%p\n", ip));

if (range == NULL)
{
Expand All @@ -5204,7 +5203,7 @@ bool DebuggerStepper::IsInRange(SIZE_T ip, COR_DEBUG_STEP_RANGE *range, SIZE_T r

if (ip >= r->startOffset && ip < endOffset)
{
LOG((LF_CORDB,LL_INFO1000,"DS::IIR:this:0x%x Found native offset "
LOG((LF_CORDB,LL_INFO1000,"DS::IIR:this:0x%p Found native offset "
"0x%x to be in the range"
"[0x%x, 0x%x), index 0x%x\n\n", this, ip, r->startOffset,
endOffset, ((r-range)/sizeof(COR_DEBUG_STEP_RANGE *)) ));
Expand All @@ -5227,7 +5226,7 @@ bool DebuggerStepper::IsInRange(SIZE_T ip, COR_DEBUG_STEP_RANGE *range, SIZE_T r
bool DebuggerStepper::DetectHandleInterceptors(ControllerStackInfo *info)
{
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: Start DetectHandleInterceptors\n"));
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: active frame=0x%08x, has return frame=%d, return frame=0x%08x m_reason:%d\n",
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: active frame=0x%p, has return frame=%d, return frame=0x%p m_reason:%d\n",
info->m_activeFrame.frame, info->HasReturnFrame(), info->GetReturnFrame().frame, m_reason));

// If this is a normal step, then we want to continue stepping, even if we
Expand Down Expand Up @@ -5255,7 +5254,7 @@ bool DebuggerStepper::DetectHandleInterceptors(ControllerStackInfo *info)
}
else
{
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: 0x%x set to STEP_INTERCEPT\n", this));
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: 0x%p set to STEP_INTERCEPT\n", this));

m_reason = STEP_INTERCEPT; //remember why we've stopped
}
Expand Down Expand Up @@ -5547,7 +5546,7 @@ bool DebuggerStepper::TrapStepInto(ControllerStackInfo *info,
if (IsCloserToRoot(info->m_activeFrame.fp, m_fpStepInto))
m_fpStepInto = info->m_activeFrame.fp;

LOG((LF_CORDB, LL_INFO1000, "Ds::TSI this:0x%x m_fpStepInto:0x%x\n",
LOG((LF_CORDB, LL_INFO1000, "DS::TSI this:0x%p m_fpStepInto:0x%p\n",
this, m_fpStepInto.GetSPValue()));

TraceDestination trace;
Expand Down Expand Up @@ -5867,8 +5866,6 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)
// assume our context is bogus.
if (fIsActiveFrameLive)
{
LOG((LF_CORDB,LL_INFO10000, "DC::TS: immediate?\n"));

// Note that by definition our walker must always be able to step
// through a single instruction, so any return
// of NULL IP's from those cases on the first step
Expand Down Expand Up @@ -5980,7 +5977,7 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)
}
if (walker.GetSkipIP() == NULL)
{
LOG((LF_CORDB,LL_INFO10000,"DS::TS 0x%x m_reason = STEP_CALL (skip)\n",
LOG((LF_CORDB,LL_INFO10000,"DS::TS 0x%p m_reason = STEP_CALL (skip)\n",
this));
m_reason = STEP_CALL;

Expand All @@ -5994,8 +5991,8 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)

case WALK_UNKNOWN:
LWALK_UNKNOWN:
LOG((LF_CORDB,LL_INFO10000,"DS::TS:WALK_UNKNOWN - curIP:0x%x "
"nextIP:0x%x skipIP:0x%x 1st byte of opcode:0x%x\n", (BYTE*)GetControlPC(&(info->m_activeFrame.
LOG((LF_CORDB,LL_INFO10000,"DS::TS:WALK_UNKNOWN - curIP:0x%p "
"nextIP:0x%p skipIP:0x%p 1st byte of opcode:0x%x\n", (BYTE*)GetControlPC(&(info->m_activeFrame.
registers)), walker.GetNextIP(),walker.GetSkipIP(),
*(BYTE*)GetControlPC(&(info->m_activeFrame.registers))));

Expand Down Expand Up @@ -6145,7 +6142,7 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)
info->GetReturnFrame().fp,
NULL);

LOG((LF_CORDB,LL_INFO10000,"DS 0x%x m_reason=STEP_CALL4\n",this));
LOG((LF_CORDB,LL_INFO10000,"DS 0x%p m_reason=STEP_CALL4\n",this));
m_reason = STEP_CALL;

return true;
Expand Down Expand Up @@ -6387,7 +6384,7 @@ void DebuggerStepper::TrapStepOut(ControllerStackInfo *info, bool fForceTraditio
else
#endif // FEATURE_MULTICASTSTUB_AS_IL
if (info->m_activeFrame.md != nullptr && info->m_activeFrame.md->IsILStub() &&
info->m_activeFrame.md->AsDynamicMethodDesc()->GetILStubResolver()->GetStubType() == ILStubResolver::TailCallCallTargetStub)
info->m_activeFrame.md->AsDynamicMethodDesc()->GetILStubType() == DynamicMethodDesc::StubTailCallCallTarget)
{
// Normally the stack trace would not include IL stubs, but we
// include this specific IL stub so that we can check if a call into
Expand Down Expand Up @@ -6716,7 +6713,7 @@ bool DebuggerStepper::SetRangesFromIL(DebuggerJitInfo *dji, COR_DEBUG_STEP_RANGE

if (dji != NULL)
{
LOG((LF_CORDB,LL_INFO10000,"DeSt::St: For code md=0x%x, got DJI 0x%x, from 0x%x to 0x%x\n",
LOG((LF_CORDB,LL_INFO10000,"DeSt::St: For code md=0x%p, got DJI 0x%p, from 0x%p to 0x%p\n",
fd,
dji, dji->m_addrOfCode, (ULONG)dji->m_addrOfCode
+ (ULONG)dji->m_sizeOfCode));
Expand Down Expand Up @@ -6981,7 +6978,7 @@ bool DebuggerStepper::Step(FramePointer fp, bool in,
}
m_eMode = m_stepIn ? cStepIn : cStepOver;

LOG((LF_CORDB,LL_INFO10000,"DS 0x%x STep: STEP_NORMAL\n",this));
LOG((LF_CORDB,LL_INFO10000,"DS 0x%p Step: STEP_NORMAL\n",this));
m_reason = STEP_NORMAL; //assume it'll be a normal step & set it to
//something else if we walk over it
if (fIsILStub)
Expand Down Expand Up @@ -7035,7 +7032,7 @@ TP_RESULT DebuggerStepper::TriggerPatch(DebuggerControllerPatch *patch,
Thread *thread,
TRIGGER_WHY tyWhy)
{
LOG((LF_CORDB, LL_INFO10000, "DeSt::TP\n"));
LOG((LF_CORDB, LL_INFO10000, "DS::TP\n"));

// If we're frozen, we may hit a patch but we just ignore it
if (IsFrozen())
Expand Down Expand Up @@ -7221,7 +7218,7 @@ TP_RESULT DebuggerStepper::TriggerPatch(DebuggerControllerPatch *patch,

m_reason = STEP_NORMAL; //we tried to do a STEP_CALL, but since it didn't
//work, we're doing what amounts to a normal step.
LOG((LF_CORDB,LL_INFO10000,"DS 0x%x m_reason = STEP_NORMAL"
LOG((LF_CORDB,LL_INFO10000,"DS 0x%p m_reason = STEP_NORMAL"
"(attempted call thru stub manager, SM didn't know where"
" we're going, so did a step out to original call\n",this));
}
Expand Down Expand Up @@ -7337,13 +7334,13 @@ void DebuggerStepper::TriggerMethodEnter(Thread * thread,
_ASSERTE(!IsFrozen());

MethodDesc * pDesc = dji->m_nativeCodeVersion.GetMethodDesc();
LOG((LF_CORDB, LL_INFO10000, "DJMCStepper::TME, desc=%p, addr=%p\n",
LOG((LF_CORDB, LL_INFO10000, "DebuggerStepper::TME, desc=%p, addr=%p\n",
pDesc, ip));

// JMC steppers won't stop in Lightweight delegates. Just return & keep executing.
// JMC steppers won't stop in Lightweight codegen (LCG). Just return & keep executing.
if (pDesc->IsNoMetadata())
{
LOG((LF_CORDB, LL_INFO100000, "DJMCStepper::TME, skipping b/c it's lw-codegen\n"));
LOG((LF_CORDB, LL_INFO100000, "DebuggerStepper::TME, skipping b/c it's dynamic code (LCG)\n"));
return;
}

Expand Down Expand Up @@ -7450,7 +7447,7 @@ bool DebuggerStepper::TriggerSingleStep(Thread *thread, const BYTE *ip)
}

// If we EnC the method, we'll blast the function address,
// and so have to get it from teh DJI that we'll have. If
// and so have to get it from the DJI that we'll have. If
// we haven't gotten debugger info about a regular function, then
// we'll have to get the info from the EE, which will be valid
// since we're standing in the function at this point, and
Expand Down
26 changes: 8 additions & 18 deletions src/coreclr/debug/ee/debugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2488,7 +2488,7 @@ void Debugger::JITComplete(NativeCodeVersion nativeCodeVersion, TADDR newAddress

MethodDesc* fd = nativeCodeVersion.GetMethodDesc();

LOG((LF_CORDB, LL_INFO100000, "D::JITComplete: md:0x%x (%s::%s), address:0x%x.\n",
LOG((LF_CORDB, LL_INFO100000, "D::JITComplete: md:0x%p (%s::%s), address:0x%p.\n",
fd, fd->m_pszDebugClassName, fd->m_pszDebugMethodName,
newAddress));

Expand Down Expand Up @@ -2521,13 +2521,13 @@ void Debugger::JITComplete(NativeCodeVersion nativeCodeVersion, TADDR newAddress
// method on two threads. When this occurs both threads will
// return the same code pointer and this callback is invoked
// multiple times.
LOG((LF_CORDB, LL_INFO1000000, "D::JITComplete: md:0x%x (%s::%s), address:0x%x. Already created\n",
LOG((LF_CORDB, LL_INFO1000000, "D::JITComplete: md:0x%p (%s::%s), address:0x%p. Already created\n",
fd, fd->m_pszDebugClassName, fd->m_pszDebugMethodName,
newAddress));
goto Exit;
}

LOG((LF_CORDB, LL_INFO1000000, "D::JITComplete: md:0x%x (%s::%s), address:0x%x. Created ji:0x%x\n",
LOG((LF_CORDB, LL_INFO1000000, "D::JITComplete: md:0x%p (%s::%s), address:0x%p. Created ji:0x%p\n",
fd, fd->m_pszDebugClassName, fd->m_pszDebugMethodName,
newAddress, ji));

Expand Down Expand Up @@ -2730,16 +2730,8 @@ DebuggerJitInfo *Debugger::GetJitInfoWorker(MethodDesc *fd, const BYTE *pbAddr,
break;
}
}
LOG((LF_CORDB, LL_INFO1000, "D::GJI: for md:0x%x (%s::%s), got dmi:0x%x.\n",
fd, fd->m_pszDebugClassName, fd->m_pszDebugMethodName,
dmi));




// Log stuff - fd may be null; so we don't want to AV in the log.

LOG((LF_CORDB, LL_INFO1000, "D::GJI: for md:0x%x (%s::%s), got dmi:0x%x, dji:0x%x, latest dji:0x%x, latest fd:0x%x, prev dji:0x%x\n",
LOG((LF_CORDB, LL_INFO1000, "D::GJI: for md:0x%p (%s::%s), got dmi:0x%p, dji:0x%p, latest dji:0x%p, latest fd:0x%p, prev dji:0x%p\n",
fd, fd->m_pszDebugClassName, fd->m_pszDebugMethodName,
dmi, dji, (dmi ? dmi->GetLatestJitInfo_NoCreate() : 0),
((dmi && dmi->GetLatestJitInfo_NoCreate()) ? dmi->GetLatestJitInfo_NoCreate()->m_nativeCodeVersion.GetMethodDesc():0),
Expand Down Expand Up @@ -4816,7 +4808,7 @@ HRESULT Debugger::MapAndBindFunctionPatches(DebuggerJitInfo *djiNew,
mdMethodDef md = fd->GetMemberDef();

LOG((LF_CORDB,LL_INFO10000,"D::MABFP: All BPs will be mapped to "
"Ver:0x%04x (DJI:0x%08x)\n", djiNew?djiNew->m_methodInfo->GetCurrentEnCVersion():0, djiNew));
"Ver:0x%04x (DJI:0x%p)\n", djiNew?djiNew->m_methodInfo->GetCurrentEnCVersion():0, djiNew));

// We need to traverse the patch list while under the controller lock (small lock).
// But we can only send BreakpointSetErros while under the debugger lock (big lock).
Expand Down Expand Up @@ -4855,7 +4847,7 @@ HRESULT Debugger::MapAndBindFunctionPatches(DebuggerJitInfo *djiNew,
// elsewhere.
if(dcp->pMethodDescFilter != NULL && dcp->pMethodDescFilter != djiNew->m_nativeCodeVersion.GetMethodDesc())
{
LOG((LF_CORDB, LL_INFO10000, "Patch not in this generic instance\n"));
LOG((LF_CORDB, LL_INFO10000, "Patch not in this generic instance, filter 0x%p\n", dcp->pMethodDescFilter));
continue;
}

Expand Down Expand Up @@ -5467,7 +5459,7 @@ void Debugger::ReleaseAllRuntimeThreads(AppDomain *pAppDomain)
//<TODO>@todo APPD if we want true isolation, remove this & finish the work</TODO>
pAppDomain = NULL;

STRESS_LOG1(LF_CORDB, LL_INFO10000, "D::RART: Releasing all Runtime threads"
STRESS_LOG1(LF_CORDB, LL_INFO10000, "D::RART: Releasing all Runtime threads "
"for AppD 0x%x.\n", pAppDomain);

// Mark that we're on our way now...
Expand Down Expand Up @@ -5679,8 +5671,6 @@ void Debugger::TraceCall(const BYTE *code)
* Invoked from a probe in managed code when we enter a user method and
* the flag (set by GetJMCFlagAddr) for that method is != 0.
* pIP - the ip within the method, right after the prolog.
* sp - stack pointer (frame pointer on x86) for the managed method we're entering.
* bsp - backing store pointer for the managed method we're entering
******************************************************************************/
void Debugger::OnMethodEnter(void * pIP)
{
Expand All @@ -5695,7 +5685,7 @@ void Debugger::OnMethodEnter(void * pIP)

if (!CORDebuggerAttached())
{
LOG((LF_CORDB, LL_INFO1000000, "D::OnMethodEnter returning since debugger attached.\n"));
LOG((LF_CORDB, LL_INFO1000000, "D::OnMethodEnter returning since debugger not attached.\n"));
return;
}
FramePointer fp = LEAF_MOST_FRAME;
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/debug/ee/frameinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1568,7 +1568,7 @@ StackWalkAction DebuggerWalkStackProc(CrawlFrame *pCF, void *data)
#ifdef FEATURE_MULTICASTSTUB_AS_IL
use |= dMD->IsMulticastStub();
#endif
use |= dMD->GetILStubResolver()->GetStubType() == ILStubResolver::TailCallCallTargetStub;
use |= dMD->GetILStubType() == DynamicMethodDesc::StubTailCallCallTarget;

if (use)
{
Expand Down
Loading