diff --git a/src/coreclr/debug/ee/debugger.cpp b/src/coreclr/debug/ee/debugger.cpp index cdde8f49dc0821..54bde6c60c6845 100644 --- a/src/coreclr/debug/ee/debugger.cpp +++ b/src/coreclr/debug/ee/debugger.cpp @@ -8886,6 +8886,40 @@ void Debugger::ThreadStarted(Thread* pRuntimeThread) } +void Debugger::SendCreateThreadAtInterpreterEntry(Thread *pRuntimeThread) +{ + CONTRACTL + { + NOTHROW; + GC_TRIGGERS; + MODE_ANY; + PRECONDITION(pRuntimeThread != NULL); + PRECONDITION(pRuntimeThread == g_pEEInterface->GetThread()); + } + CONTRACTL_END; + + if (CORDBUnrecoverableError(this)) + return; + + if (!CORDebuggerAttached()) + return; + + { + GCX_PREEMP(); + PollWaitingForHelper(); + } + + SENDIPCEVENT_BEGIN(this, pRuntimeThread); + + if (CORDebuggerAttached()) + { + ThreadStarted(pRuntimeThread); + } + + SENDIPCEVENT_END; +} + + //--------------------------------------------------------------------------------------- // // DetachThread is called by Runtime threads when they are completing diff --git a/src/coreclr/debug/ee/debugger.h b/src/coreclr/debug/ee/debugger.h index 3969a776b6c4d3..af803de1dff02d 100644 --- a/src/coreclr/debug/ee/debugger.h +++ b/src/coreclr/debug/ee/debugger.h @@ -1925,6 +1925,7 @@ class Debugger : public DebugInterface void ThreadCreated(Thread* pRuntimeThread); void ThreadStarted(Thread* pRuntimeThread); + void SendCreateThreadAtInterpreterEntry(Thread* pRuntimeThread); void DetachThread(Thread *pRuntimeThread); BOOL SuspendComplete(bool isEESuspendedForGC = false); diff --git a/src/coreclr/vm/dbginterface.h b/src/coreclr/vm/dbginterface.h index ba796e2df778e1..498f268bfae9f6 100644 --- a/src/coreclr/vm/dbginterface.h +++ b/src/coreclr/vm/dbginterface.h @@ -380,6 +380,8 @@ class DebugInterface virtual void ExternalMethodFixupNextStep(PCODE address) = 0; virtual void ProcessAnyPendingEvals(Thread* pThread) = 0; + virtual void SendCreateThreadAtInterpreterEntry(Thread* pRuntimeThread) = 0; + #endif //DACCESS_COMPILE }; diff --git a/src/coreclr/vm/threads.cpp b/src/coreclr/vm/threads.cpp index e820c8678586e0..5055d6d12cc405 100644 --- a/src/coreclr/vm/threads.cpp +++ b/src/coreclr/vm/threads.cpp @@ -6558,7 +6558,7 @@ InterpThreadContext* Thread::GetOrCreateInterpThreadContext() CONTRACTL { THROWS; - GC_NOTRIGGER; + GC_TRIGGERS; MODE_ANY; } CONTRACTL_END; @@ -6566,6 +6566,13 @@ InterpThreadContext* Thread::GetOrCreateInterpThreadContext() if (m_pInterpThreadContext == nullptr) { m_pInterpThreadContext = new InterpThreadContext(); + +#ifdef DEBUGGING_SUPPORTED + if (CORDebuggerAttached() && g_pDebugInterface != NULL) + { + g_pDebugInterface->SendCreateThreadAtInterpreterEntry(this); + } +#endif // DEBUGGING_SUPPORTED } return m_pInterpThreadContext;