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

[release/9.0-staging] [debugger] Fix a step that becomes a go #110533

Merged
10 changes: 9 additions & 1 deletion src/coreclr/debug/ee/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7410,7 +7410,15 @@ bool DebuggerStepper::TriggerSingleStep(Thread *thread, const BYTE *ip)
if (!g_pEEInterface->IsManagedNativeCode(ip))
{
LOG((LF_CORDB,LL_INFO10000, "DS::TSS: not in managed code, Returning false (case 0)!\n"));
DisableSingleStep();
// Sometimes we can get here with a callstack that is coming from an APC
// this will disable the single stepping and incorrectly resume an app that the user
// is stepping through.
#ifdef FEATURE_THREAD_ACTIVATION
if ((thread->m_State & Thread::TS_DebugWillSync) == 0)
#endif
{
DisableSingleStep();
}
return false;
}

Expand Down
12 changes: 9 additions & 3 deletions src/coreclr/vm/threadsuspend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5746,8 +5746,9 @@ BOOL CheckActivationSafePoint(SIZE_T ip)
Thread *pThread = GetThreadNULLOk();

// The criteria for safe activation is to be running managed code.
// Also we are not interested in handling interruption if we are already in preemptive mode.
BOOL isActivationSafePoint = pThread != NULL &&
// Also we are not interested in handling interruption if we are already in preemptive mode nor if we are single stepping
BOOL isActivationSafePoint = pThread != NULL &&
(pThread->m_StateNC & Thread::TSNC_DebuggerIsStepping) == 0 &&
pThread->PreemptiveGCDisabled() &&
ExecutionManager::IsManagedCode(ip);

Expand Down Expand Up @@ -5932,7 +5933,12 @@ bool Thread::InjectActivation(ActivationReason reason)
{
return true;
}

// Avoid APC calls when the thread is in single step state to avoid any
// wrong resume because it's running a native code.
if ((m_StateNC & Thread::TSNC_DebuggerIsStepping) != 0)
{
return false;
}
#ifdef FEATURE_SPECIAL_USER_MODE_APC
_ASSERTE(UseSpecialUserModeApc());

Expand Down
Loading