GPTR_IMPL(EEDebugInterface, g_pEEInterface);
SVAL_IMPL_INIT(BOOL, Debugger, s_fCanChangeNgenFlags, TRUE);
+// This is a public export so debuggers can read and determine if the coreclr
+// process is waiting for JIT debugging attach.
+GVAL_IMPL_INIT(ULONG, CLRJitAttachState, 0);
+
bool g_EnableSIS = false;
// The following instances are used for invoking overloaded new/delete
#endif //_DEBUG
m_threadsAtUnsafePlaces(0),
m_jitAttachInProgress(FALSE),
- m_attachingForManagedEvent(FALSE),
m_launchingDebugger(FALSE),
- m_userRequestedDebuggerLaunch(FALSE),
m_LoggingEnabled(TRUE),
m_pAppDomainCB(NULL),
m_dClassLoadCallbackCount(0),
CLR_DEBUGGING_PROCESS_FLAGS Debugger::GetAttachStateFlags()
{
LIMITED_METHOD_DAC_CONTRACT;
- return (CLR_DEBUGGING_PROCESS_FLAGS)
- ((m_attachingForManagedEvent ? CLR_DEBUGGING_MANAGED_EVENT_PENDING : 0)
- | (m_userRequestedDebuggerLaunch ? CLR_DEBUGGING_MANAGED_EVENT_DEBUGGER_LAUNCH : 0));
+ ULONG flags = CLRJitAttachState;
+ return (CLR_DEBUGGING_PROCESS_FLAGS)flags;
}
#ifndef DACCESS_COMPILE
if (!m_jitAttachInProgress)
{
m_jitAttachInProgress = TRUE;
- m_attachingForManagedEvent = willSendManagedEvent;
m_launchingDebugger = willLaunchDebugger;
- m_userRequestedDebuggerLaunch = explicitUserRequest;
+ CLRJitAttachState = (willSendManagedEvent ? CLR_DEBUGGING_MANAGED_EVENT_PENDING : 0) | (explicitUserRequest ? CLR_DEBUGGING_MANAGED_EVENT_DEBUGGER_LAUNCH : 0);
ResetEvent(GetUnmanagedAttachEvent());
ResetEvent(GetAttachEvent());
LOG( (LF_CORDB, LL_INFO10000, "D::PreJA: Leaving - first thread\n") );
// clear the attaching flags which allows other threads to initiate jit attach if needed
m_jitAttachInProgress = FALSE;
- m_attachingForManagedEvent = FALSE;
m_launchingDebugger = FALSE;
- m_userRequestedDebuggerLaunch = FALSE;
+ CLRJitAttachState = 0;
+
// set the attaching events to unblock other threads waiting on this attach
// regardless of whether or not it completed
SetEvent(GetUnmanagedAttachEvent());
GPTR_DECL(Debugger, g_pDebugger);
GPTR_DECL(EEDebugInterface, g_pEEInterface);
+GVAL_DECL(ULONG, CLRJitAttachState);
#ifndef FEATURE_PAL
GVAL_DECL(HANDLE, g_hContinueStartupEvent);
#endif
#endif
LONG m_threadsAtUnsafePlaces;
Volatile<BOOL> m_jitAttachInProgress;
-
- // True if after the jit attach we plan to send a managed non-catchup
- // debug event
- BOOL m_attachingForManagedEvent;
BOOL m_launchingDebugger;
- BOOL m_userRequestedDebuggerLaunch;
-
BOOL m_LoggingEnabled;
AppDomainEnumerationIPCBlock *m_pAppDomainCB;
; This cannot change, or else CoreCLR debugging will not work.
; See clr\src\DLLS\dbgshim\dbgshim.cpp.
g_CLREngineMetrics @2 data
+
+ ; VS depends on CLRJitAttachState having a ordinal of 3. This cannot change.
+ CLRJitAttachState @3 data
; Unix hosting API
coreclr_create_delegate
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pDebugInterface, ::g_pDebugInterface)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pEEDbgInterfaceImpl, ::g_pEEDbgInterfaceImpl)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pEEInterface, ::g_pEEInterface)
+DEFINE_DACVAR(ULONG, ULONG, dac__CLRJitAttachState, ::CLRJitAttachState)
DEFINE_DACVAR(ULONG, BOOL, Debugger__s_fCanChangeNgenFlags, Debugger::s_fCanChangeNgenFlags)
DEFINE_DACVAR(ULONG, PTR_DebuggerPatchTable, DebuggerController__g_patches, DebuggerController::g_patches)
DEFINE_DACVAR(ULONG, BOOL, DebuggerController__g_patchTableValid, DebuggerController::g_patchTableValid)
-
DEFINE_DACVAR(ULONG, SIZE_T, dac__gLowestFCall, ::gLowestFCall)
DEFINE_DACVAR(ULONG, SIZE_T, dac__gHighestFCall, ::gHighestFCall)
DEFINE_DACVAR(ULONG, SIZE_T, dac__gFCallMethods, ::gFCallMethods)
DEFINE_DACVAR(ULONG, DWORD, PEFile__s_NGENDebugFlags, PEFile::s_NGENDebugFlags)
#endif //defined(DEBUGGING_SUPPORTED) && defined (FEATURE_PREJIT)
-
-
#ifdef FEATURE_MINIMETADATA_IN_TRIAGEDUMPS
DEFINE_DACVAR(ULONG, DWORD, dac__g_MiniMetaDataBuffMaxSize, ::g_MiniMetaDataBuffMaxSize)
DEFINE_DACVAR(ULONG, TADDR, dac__g_MiniMetaDataBuffAddress, ::g_MiniMetaDataBuffAddress)