Saving progress - works towards gc events
authorAndrew Au <andrewau@microsoft.com>
Wed, 9 May 2018 16:40:47 +0000 (09:40 -0700)
committerAndrew Au <cshung@gmail.com>
Wed, 7 Nov 2018 02:34:47 +0000 (18:34 -0800)
Commit migrated from https://github.com/dotnet/coreclr/commit/1df9f792fa4a421014354063f8a63eca925c20e7

15 files changed:
src/coreclr/src/debug/di/process.cpp
src/coreclr/src/debug/di/rsmain.cpp
src/coreclr/src/debug/di/rspriv.h
src/coreclr/src/debug/di/shimcallback.cpp
src/coreclr/src/debug/di/shimevents.cpp
src/coreclr/src/debug/di/shimpriv.h
src/coreclr/src/debug/ee/debugger.cpp
src/coreclr/src/debug/ee/debugger.h
src/coreclr/src/debug/inc/dbgipceventtypes.h
src/coreclr/src/inc/cordebug.idl
src/coreclr/src/pal/prebuilt/idl/cordebug_i.cpp
src/coreclr/src/pal/prebuilt/inc/cordebug.h
src/coreclr/src/vm/dbginterface.h
src/coreclr/src/vm/debugdebugger.cpp
src/coreclr/src/vm/gcenv.ee.cpp

index c09f4a2..a49addc 100644 (file)
@@ -4725,6 +4725,7 @@ void CordbProcess::DispatchRCEvent()
     _ASSERTE(m_cordb->m_managedCallback != NULL);
     _ASSERTE(m_cordb->m_managedCallback2 != NULL);
     _ASSERTE(m_cordb->m_managedCallback3 != NULL);
+    _ASSERTE(m_cordb->m_managedCallback4 != NULL);
 
 
     // Bump up the stop count. Either we'll dispatch a managed event,
@@ -4795,7 +4796,7 @@ void CordbProcess::DispatchRCEvent()
                     m_pDBGLastIPCEventType = pEvent->GetDebugCookie();
 #endif
 
-                    ManagedEvent::DispatchArgs args(m_cordb->m_managedCallback, m_cordb->m_managedCallback2, m_cordb->m_managedCallback3);        
+                    ManagedEvent::DispatchArgs args(m_cordb->m_managedCallback, m_cordb->m_managedCallback2, m_cordb->m_managedCallback3, m_cordb->m_managedCallback4);        
 
                     {
                         // Release lock around the dispatch of the event
@@ -4910,7 +4911,8 @@ void CordbProcess::RawDispatchEvent(
     RSLockHolder *              pLockHolder,
     ICorDebugManagedCallback *  pCallback1, 
     ICorDebugManagedCallback2 * pCallback2,
-    ICorDebugManagedCallback3 * pCallback3)
+    ICorDebugManagedCallback3 * pCallback3,
+    ICorDebugManagedCallback4 * pCallback4)
 {
     CONTRACTL
     {
@@ -5015,6 +5017,15 @@ void CordbProcess::RawDispatchEvent(
         }
         break;
 
+    case DB_IPCE_SOME_WORK:
+        {
+            {
+                PUBLIC_CALLBACK_IN_THIS_SCOPE(this, pLockHolder, pEvent);
+                pCallback4->SomeWork(pThread, pAppDomain);
+            }
+            break;
+        }
+
     case DB_IPCE_DATA_BREAKPOINT:
         {
             _ASSERTE(pThread != NULL);
@@ -10470,9 +10481,12 @@ void CordbProcess::HandleRCEvent(
     RSExtSmartPtr<ICorDebugManagedCallback3> pCallback3;
     pCallback->QueryInterface(IID_ICorDebugManagedCallback3, reinterpret_cast<void **> (&pCallback3));   
 
+    RSExtSmartPtr<ICorDebugManagedCallback4> pCallback4;
+    pCallback->QueryInterface(IID_ICorDebugManagedCallback4, reinterpret_cast<void **> (&pCallback4));
+
     // Dispatch directly. May not necessarily dispatch an event.
     // Toggles the lock to dispatch callbacks.
-    RawDispatchEvent(pManagedEvent, pLockHolder, pCallback, pCallback2, pCallback3);    
+    RawDispatchEvent(pManagedEvent, pLockHolder, pCallback, pCallback2, pCallback3, pCallback4);    
 }
 
 //
index 75a6ad0..39ac60d 100644 (file)
@@ -852,6 +852,84 @@ namespace
         pAppDomain->Continue(false);
         return S_OK;
     }
+
+    //
+    // DefaultManagedCallback4
+    //
+    // In the event that the debugger is of an older version than the Right Side & Left Side, the Right Side may issue
+    // new callbacks that the debugger is not expecting. In this case, we need to provide a default behavior for those
+    // new callbacks, if for nothing else than to force the debugger to Continue().
+    //
+    class DefaultManagedCallback4 : public ICorDebugManagedCallback4
+    {
+    public:
+        DefaultManagedCallback4(ICorDebug* pDebug);
+        virtual ~DefaultManagedCallback4() { }
+        virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** pInterface);
+        virtual ULONG STDMETHODCALLTYPE AddRef();
+        virtual ULONG STDMETHODCALLTYPE Release();
+        COM_METHOD SomeWork(ICorDebugThread * pThread, ICorDebugAppDomain * pAppDomain);
+    private:
+        // not implemented
+        DefaultManagedCallback4(const DefaultManagedCallback4&);
+        DefaultManagedCallback4& operator=(const DefaultManagedCallback4&);
+
+        ICorDebug* m_pDebug;
+        LONG m_refCount;
+    };
+
+    DefaultManagedCallback4::DefaultManagedCallback4(ICorDebug* pDebug) : m_pDebug(pDebug), m_refCount(0)
+    {
+    }
+
+    HRESULT
+        DefaultManagedCallback4::QueryInterface(REFIID iid, void** pInterface)
+    {
+        if (IID_ICorDebugManagedCallback4 == iid)
+        {
+            *pInterface = static_cast<ICorDebugManagedCallback4*>(this);
+        }
+        else if (IID_IUnknown == iid)
+        {
+            *pInterface = static_cast<IUnknown*>(this);
+        }
+        else
+        {
+            *pInterface = NULL;
+            return E_NOINTERFACE;
+        }
+
+        this->AddRef();
+        return S_OK;
+    }
+
+    ULONG
+        DefaultManagedCallback4::AddRef()
+    {
+        return InterlockedIncrement(&m_refCount);
+    }
+
+    ULONG
+        DefaultManagedCallback4::Release()
+    {
+        ULONG ulRef = InterlockedDecrement(&m_refCount);
+        if (0 == ulRef)
+        {
+            delete this;
+        }
+
+        return ulRef;
+    }
+
+    HRESULT
+        DefaultManagedCallback4::SomeWork(ICorDebugThread * pThread, ICorDebugAppDomain * pAppDomain)
+    {
+        //
+        // Just ignore and continue the process.
+        //
+        pAppDomain->Continue(false);
+        return S_OK;
+    }
 }
 
 /* ------------------------------------------------------------------------- *
@@ -1055,6 +1133,7 @@ HRESULT Cordb::Terminate()
     m_managedCallback.Clear();
     m_managedCallback2.Clear();
     m_managedCallback3.Clear();
+    m_managedCallback4.Clear();
     m_unmanagedCallback.Clear();
 
     // The Shell may still have outstanding references, so we don't want to shutdown logging yet.
@@ -1209,7 +1288,7 @@ void Cordb::AddProcess(CordbProcess* process)
     // can have another debuggee.
     STRESS_LOG1(LF_CORDB, LL_INFO10, "Cordb::AddProcess %08x...\n", process);
 
-    if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL))
+    if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL) || (m_managedCallback4 == NULL))
     {
         ThrowHR(E_FAIL);
     }
@@ -1352,6 +1431,7 @@ HRESULT Cordb::SetManagedHandler(ICorDebugManagedCallback *pCallback)
     m_managedCallback.Clear();
     m_managedCallback2.Clear();
     m_managedCallback3.Clear();
+    m_managedCallback4.Clear();
 
     // For SxS, V2.0 debuggers must implement ManagedCallback2 to handle v2.0 debug events.
     // For Single-CLR, A v1.0 debugger may actually geta V2.0 debuggee.
@@ -1376,7 +1456,6 @@ HRESULT Cordb::SetManagedHandler(ICorDebugManagedCallback *pCallback)
         }
     }
 
-
     pCallback->QueryInterface(IID_ICorDebugManagedCallback3, (void **)&m_managedCallback3);
     if (m_managedCallback3 == NULL)
     {
@@ -1388,6 +1467,17 @@ HRESULT Cordb::SetManagedHandler(ICorDebugManagedCallback *pCallback)
         return E_OUTOFMEMORY;
     }
 
+    pCallback->QueryInterface(IID_ICorDebugManagedCallback4, (void **)&m_managedCallback4);
+    if (m_managedCallback4 == NULL)
+    {
+        m_managedCallback4.Assign(new (nothrow) DefaultManagedCallback4(this));
+    }
+
+    if (m_managedCallback4 == NULL)
+    {
+        return E_OUTOFMEMORY;
+    }
+
     m_managedCallback.Assign(pCallback);
     return S_OK;
 }
@@ -1567,7 +1657,7 @@ HRESULT Cordb::CreateProcessCommon(ICorDebugRemoteTarget * pRemoteTarget,
     #endif // FEATURE_INTEROP_DEBUGGING
 
         // Must have a managed-callback by now.
-        if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL))
+        if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL) || (m_managedCallback4 == NULL))
         {
             ThrowHR(E_FAIL);
         }
@@ -1702,7 +1792,7 @@ HRESULT Cordb::DebugActiveProcessCommon(ICorDebugRemoteTarget * pRemoteTarget,
         }
 
         // Must have a managed-callback by now.
-        if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL))
+        if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL) || (m_managedCallback4 == NULL))
         {
             ThrowHR(E_FAIL);
         }
index 8ba99bc..950013a 100644 (file)
@@ -2332,6 +2332,7 @@ public:
     RSExtSmartPtr<ICorDebugManagedCallback>    m_managedCallback;
     RSExtSmartPtr<ICorDebugManagedCallback2>   m_managedCallback2;
     RSExtSmartPtr<ICorDebugManagedCallback3>   m_managedCallback3;
+    RSExtSmartPtr<ICorDebugManagedCallback4>   m_managedCallback4;
     RSExtSmartPtr<ICorDebugUnmanagedCallback>  m_unmanagedCallback;
 
     CordbRCEventThread*         m_rcEventThread;
@@ -3337,7 +3338,8 @@ public:
         RSLockHolder *              pLockHolder,
         ICorDebugManagedCallback *  pCallback1, 
         ICorDebugManagedCallback2 * pCallback2,
-        ICorDebugManagedCallback3 * pCallback3);
+        ICorDebugManagedCallback3 * pCallback3,
+        ICorDebugManagedCallback4 * pCallback4);
 
     void MarkAllThreadsDirty();
 
index e5c74bd..35e9f38 100644 (file)
@@ -58,6 +58,10 @@ HRESULT ShimProxyCallback::QueryInterface(REFIID riid, void **ppInterface)
     {
         *ppInterface = static_cast<ICorDebugManagedCallback3*>(this);
     }
+    else if (riid == IID_ICorDebugManagedCallback4)
+    {
+        *ppInterface = static_cast<ICorDebugManagedCallback4*>(this);
+    }
     else if (riid == IID_IUnknown)
     {
         *ppInterface = static_cast<IUnknown*>(static_cast<ICorDebugManagedCallback*>(this));
@@ -1313,4 +1317,39 @@ HRESULT ShimProxyCallback::CustomNotification(ICorDebugThread * pThread, ICorDeb
     return S_OK;
 }
 
+// Implementation of ICorDebugManagedCallback4::SomeWork
+// Arguments:
+//      input:
+//          pThread    - thread on which the notification occurred
+//          pAppDomain - appDomain in which the notification occurred
+// Return value: S_OK
+HRESULT ShimProxyCallback::SomeWork(ICorDebugThread * pThread, ICorDebugAppDomain * pAppDomain)
+{
+    m_pShim->PreDispatchEvent();
+    class SomeWorkEvent : public ManagedEvent
+    {
+        // callbacks parameters. These are strong references
+        RSExtSmartPtr<ICorDebugAppDomain > m_pAppDomain;
+        RSExtSmartPtr<ICorDebugThread > m_pThread;
+
+    public:
+        // Ctor
+        SomeWorkEvent(ICorDebugThread * pThread, ICorDebugAppDomain * pAppDomain) :
+            ManagedEvent(pThread)
+        {
+            this->m_pAppDomain.Assign(pAppDomain);
+            this->m_pThread.Assign(pThread);
+        }
+
+        HRESULT Dispatch(DispatchArgs args)
+        {
+            return args.GetCallback4()->SomeWork(m_pThread, m_pAppDomain);
+        }
+    }; // end class SomeWorkEvent
+
+    m_pShim->GetManagedEventQueue()->QueueEvent(new SomeWorkEvent(pThread, pAppDomain));
+    return S_OK;
+}
+
+
 
index e54b1bd..15f4316 100644 (file)
@@ -51,11 +51,12 @@ void * ManagedEvent::GetDebugCookie()
 //    We'll have a lot of derived classes of ManagedEvent, and so encapsulating the arguments
 //    for the Dispatch() function lets us juggle them around easily without hitting every signature.
 //---------------------------------------------------------------------------------------
-ManagedEvent::DispatchArgs::DispatchArgs(ICorDebugManagedCallback * pCallback1, ICorDebugManagedCallback2 * pCallback2, ICorDebugManagedCallback3 * pCallback3)
+ManagedEvent::DispatchArgs::DispatchArgs(ICorDebugManagedCallback * pCallback1, ICorDebugManagedCallback2 * pCallback2, ICorDebugManagedCallback3 * pCallback3, ICorDebugManagedCallback4 * pCallback4)
 {
     m_pCallback1 = pCallback1;
     m_pCallback2 = pCallback2;
     m_pCallback3 = pCallback3;
+    m_pCallback4 = pCallback4;
 }
 
 
@@ -77,6 +78,12 @@ ICorDebugManagedCallback3 * ManagedEvent::DispatchArgs::GetCallback3()
     return m_pCallback3;
 }
 
+// trivial accessor to get callback 3
+ICorDebugManagedCallback4 * ManagedEvent::DispatchArgs::GetCallback4()
+{
+    return m_pCallback4;
+}
+
 // Returns OS Thread Id that this event occurred on, 0 if no thread affinity.
 DWORD ManagedEvent::GetOSTid()
 {
index 9c83301..acd3ef5 100644 (file)
@@ -61,7 +61,8 @@ typedef SHash<DuplicateCreationEventsHashTableTraits> DuplicateCreationEventsHas
 class ShimProxyCallback : 
     public ICorDebugManagedCallback,
     public ICorDebugManagedCallback2, 
-    public ICorDebugManagedCallback3
+    public ICorDebugManagedCallback3,
+    public ICorDebugManagedCallback4
 {
     ShimProcess * m_pShim; // weak reference
     LONG m_cRef; 
@@ -210,6 +211,12 @@ public:
     // Implementation of ICorDebugManagedCallback3::CustomNotification
     COM_METHOD CustomNotification(ICorDebugThread * pThread, ICorDebugAppDomain * pAppDomain);
 
+    ///
+    /// Implementation of ICorDebugManagedCallback4
+    ///
+
+    // Implementation of ICorDebugManagedCallback4::SomeWork
+    COM_METHOD SomeWork(ICorDebugThread * pThread, ICorDebugAppDomain * pAppDomain);
 };
 
 
@@ -233,17 +240,19 @@ public:
     class DispatchArgs
     {
     public:
-        DispatchArgs(ICorDebugManagedCallback * pCallback1, ICorDebugManagedCallback2 * pCallback2, ICorDebugManagedCallback3 * pCallback3);
+        DispatchArgs(ICorDebugManagedCallback * pCallback1, ICorDebugManagedCallback2 * pCallback2, ICorDebugManagedCallback3 * pCallback3, ICorDebugManagedCallback4 * pCallback4);
 
         ICorDebugManagedCallback * GetCallback1();
         ICorDebugManagedCallback2 * GetCallback2();
         ICorDebugManagedCallback3 * GetCallback3();
+        ICorDebugManagedCallback4 * GetCallback4();
 
 
     protected:
         ICorDebugManagedCallback * m_pCallback1;
         ICorDebugManagedCallback2 * m_pCallback2;
         ICorDebugManagedCallback3 * m_pCallback3;
+        ICorDebugManagedCallback4 * m_pCallback4;
     };
 
     // Returns: value of callback from end-user
index 1198e0e..19789fc 100644 (file)
@@ -5988,6 +5988,43 @@ bool Debugger::ThreadsAtUnsafePlaces(void)
     return (m_threadsAtUnsafePlaces != 0);
 }
 
+void Debugger::SomeWork()
+{
+    CONTRACTL
+    {
+        NOTHROW;
+        GC_NOTRIGGER;
+    }
+    CONTRACTL_END;
+
+    // DebuggerLockHolder lockHolder(this);
+    Thread* pThread = GetThread();
+
+    SENDIPCEVENT_BEGIN(this, pThread)
+
+    if (CORDBUnrecoverableError(this))
+        return;
+
+    // Send an event to the Right Side
+    DebuggerIPCEvent* ipce = m_pRCThread->GetIPCEventSendBuffer();
+    InitIPCEvent(ipce,
+        DB_IPCE_SOME_WORK,
+        pThread,
+        pThread->GetDomain());
+
+    m_pRCThread->SendIPCEvent();
+
+    DebuggerIPCEvent* ipce2 = m_pRCThread->GetIPCEventSendBuffer();
+    InitIPCEvent(ipce2,
+        DB_IPCE_SYNC_COMPLETE,
+        pThread,
+        pThread->GetDomain());
+
+    m_pRCThread->SendIPCEvent();
+
+    SENDIPCEVENT_END;
+}
+
 void Debugger::SendDataBreakpoint(Thread *thread, CONTEXT *context,
     DebuggerDataBreakpoint *breakpoint)
 {
index 2f85f2a..0b1cbac 100644 (file)
@@ -2951,6 +2951,9 @@ private:
 public:
     DWORD m_defines;
     DWORD m_mdDataStructureVersion;
+#ifndef DACCESS_COMPILE
+    virtual void SomeWork();
+#endif
 };
 
 
index 85422bb..49bf156 100644 (file)
@@ -91,7 +91,8 @@ IPC_EVENT_TYPE1(DB_IPCE_METADATA_UPDATE              ,0x015D)
 IPC_EVENT_TYPE1(DB_IPCE_RESOLVE_UPDATE_METADATA_1_RESULT,0x015E)
 IPC_EVENT_TYPE1(DB_IPCE_RESOLVE_UPDATE_METADATA_2_RESULT,0x015F)
 IPC_EVENT_TYPE1(DB_IPCE_DATA_BREAKPOINT              ,0x0160)
-IPC_EVENT_TYPE0(DB_IPCE_RUNTIME_LAST                 ,0x0161)   // The last event from runtime
+IPC_EVENT_TYPE1(DB_IPCE_SOME_WORK                    , 0x0161)
+IPC_EVENT_TYPE0(DB_IPCE_RUNTIME_LAST                 ,0x0162)   // The last event from runtime
 
 
 
index fea48d7..cbe7788 100644 (file)
@@ -1350,6 +1350,18 @@ interface ICorDebugManagedCallback3 : IUnknown
     HRESULT CustomNotification([in] ICorDebugThread * pThread, [in] ICorDebugAppDomain * pAppDomain);
 }
 
+[
+    object,
+    local,
+    uuid(322911AE-16A5-49BA-84A3-ED69678138A3),
+    pointer_default(unique)
+]
+
+interface ICorDebugManagedCallback4 : IUnknown
+{
+    HRESULT SomeWork([in] ICorDebugThread * pThread, [in] ICorDebugAppDomain * pAppDomain);
+}
+
 
 #pragma warning(disable:28718) /* disable warning 28718 for interface ICorDebugManagedCallback2 */
 
index 923f78b..26dcc00 100644 (file)
@@ -5,11 +5,11 @@
 /* link this file in with the server and any clients */
 
 
- /* File created by MIDL compiler version 8.00.0603 */
-/* at Fri Sep 23 15:43:16 2016
+ /* File created by MIDL compiler version 8.01.0622 */
+/* at Mon Jan 18 19:14:07 2038
  */
-/* Compiler settings for cordebug.idl:
-    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.00.0603 
+/* Compiler settings for C:/Dev/coreclr/src/inc/cordebug.idl:
+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 
     protocol : dce , ms_ext, c_ext, robust
     error checks: allocation ref bounds_check enum stub_data 
     VC __declspec() decoration level: 
@@ -63,9 +63,9 @@ typedef IID CLSID;
 #endif // CLSID_DEFINED
 
 #define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
-        const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
+        EXTERN_C __declspec(selectany) const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
 
-#endif !_MIDL_USE_GUIDDEF_
+#endif // !_MIDL_USE_GUIDDEF_
 
 MIDL_DEFINE_GUID(IID, IID_ICorDebugDataTarget,0xFE06DC28,0x49FB,0x4636,0xA4,0xA3,0xE8,0x0D,0xB4,0xAE,0x11,0x6C);
 
@@ -118,6 +118,9 @@ MIDL_DEFINE_GUID(IID, IID_ICorDebugManagedCallback,0x3d6f5f60,0x7538,0x11d3,0x8d
 MIDL_DEFINE_GUID(IID, IID_ICorDebugManagedCallback3,0x264EA0FC,0x2591,0x49AA,0x86,0x8E,0x83,0x5E,0x65,0x15,0x32,0x3F);
 
 
+MIDL_DEFINE_GUID(IID, IID_ICorDebugManagedCallback4,0x322911AE,0x16A5,0x49BA,0x84,0xA3,0xED,0x69,0x67,0x81,0x38,0xA3);
+
+
 MIDL_DEFINE_GUID(IID, IID_ICorDebugManagedCallback2,0x250E5EEA,0xDB5C,0x4C76,0xB6,0xF3,0x8C,0x46,0xF1,0x2E,0x32,0x03);
 
 
index 2cfadf6..66eaf20 100644 (file)
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.01.0622 */
 /* at Mon Jan 18 19:14:07 2038
  */
-/* Compiler settings for C:/coreclr/src/inc/cordebug.idl:
+/* Compiler settings for C:/Dev/coreclr/src/inc/cordebug.idl:
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.01.0622 
     protocol : dce , ms_ext, c_ext, robust
     error checks: allocation ref bounds_check enum stub_data 
@@ -164,6 +164,13 @@ typedef interface ICorDebugManagedCallback3 ICorDebugManagedCallback3;
 #endif         /* __ICorDebugManagedCallback3_FWD_DEFINED__ */
 
 
+#ifndef __ICorDebugManagedCallback4_FWD_DEFINED__
+#define __ICorDebugManagedCallback4_FWD_DEFINED__
+typedef interface ICorDebugManagedCallback4 ICorDebugManagedCallback4;
+
+#endif         /* __ICorDebugManagedCallback4_FWD_DEFINED__ */
+
+
 #ifndef __ICorDebugManagedCallback2_FWD_DEFINED__
 #define __ICorDebugManagedCallback2_FWD_DEFINED__
 typedef interface ICorDebugManagedCallback2 ICorDebugManagedCallback2;
@@ -353,13 +360,6 @@ typedef interface ICorDebugProcess8 ICorDebugProcess8;
 #endif         /* __ICorDebugProcess8_FWD_DEFINED__ */
 
 
-#ifndef __ICorDebugProcess9_FWD_DEFINED__
-#define __ICorDebugProcess9_FWD_DEFINED__
-typedef interface ICorDebugProcess9 ICorDebugProcess9;
-
-#endif         /* __ICorDebugProcess9_FWD_DEFINED__ */
-
-
 #ifndef __ICorDebugModuleDebugEvent_FWD_DEFINED__
 #define __ICorDebugModuleDebugEvent_FWD_DEFINED__
 typedef interface ICorDebugModuleDebugEvent ICorDebugModuleDebugEvent;
@@ -588,7 +588,7 @@ typedef interface ICorDebugFunction3 ICorDebugFunction3;
 #define __ICorDebugFunction4_FWD_DEFINED__
 typedef interface ICorDebugFunction4 ICorDebugFunction4;
 
-#endif  /* __ICorDebugFunction4_FWD_DEFINED__ */
+#endif         /* __ICorDebugFunction4_FWD_DEFINED__ */
 
 
 #ifndef __ICorDebugCode_FWD_DEFINED__
@@ -3758,14 +3758,96 @@ EXTERN_C const IID IID_ICorDebugManagedCallback3;
 #endif         /* __ICorDebugManagedCallback3_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0017 */
+#ifndef __ICorDebugManagedCallback4_INTERFACE_DEFINED__
+#define __ICorDebugManagedCallback4_INTERFACE_DEFINED__
+
+/* interface ICorDebugManagedCallback4 */
+/* [unique][uuid][local][object] */ 
+
+
+EXTERN_C const IID IID_ICorDebugManagedCallback4;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+    
+    MIDL_INTERFACE("322911AE-16A5-49BA-84A3-ED69678138A3")
+    ICorDebugManagedCallback4 : public IUnknown
+    {
+    public:
+        virtual HRESULT STDMETHODCALLTYPE SomeWork( 
+            /* [in] */ ICorDebugThread *pThread,
+            /* [in] */ ICorDebugAppDomain *pAppDomain) = 0;
+        
+    };
+    
+    
+#else  /* C style interface */
+
+    typedef struct ICorDebugManagedCallback4Vtbl
+    {
+        BEGIN_INTERFACE
+        
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
+            ICorDebugManagedCallback4 * This,
+            /* [in] */ REFIID riid,
+            /* [annotation][iid_is][out] */ 
+            _COM_Outptr_  void **ppvObject);
+        
+        ULONG ( STDMETHODCALLTYPE *AddRef )( 
+            ICorDebugManagedCallback4 * This);
+        
+        ULONG ( STDMETHODCALLTYPE *Release )( 
+            ICorDebugManagedCallback4 * This);
+        
+        HRESULT ( STDMETHODCALLTYPE *SomeWork )( 
+            ICorDebugManagedCallback4 * This,
+            /* [in] */ ICorDebugThread *pThread,
+            /* [in] */ ICorDebugAppDomain *pAppDomain);
+        
+        END_INTERFACE
+    } ICorDebugManagedCallback4Vtbl;
+
+    interface ICorDebugManagedCallback4
+    {
+        CONST_VTBL struct ICorDebugManagedCallback4Vtbl *lpVtbl;
+    };
+
+    
+
+#ifdef COBJMACROS
+
+
+#define ICorDebugManagedCallback4_QueryInterface(This,riid,ppvObject)  \
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 
+
+#define ICorDebugManagedCallback4_AddRef(This) \
+    ( (This)->lpVtbl -> AddRef(This) ) 
+
+#define ICorDebugManagedCallback4_Release(This)        \
+    ( (This)->lpVtbl -> Release(This) ) 
+
+
+#define ICorDebugManagedCallback4_SomeWork(This,pThread,pAppDomain)    \
+    ( (This)->lpVtbl -> SomeWork(This,pThread,pAppDomain) ) 
+
+#endif /* COBJMACROS */
+
+
+#endif         /* C style interface */
+
+
+
+
+#endif         /* __ICorDebugManagedCallback4_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_cordebug_0000_0018 */
 /* [local] */ 
 
 #pragma warning(disable:28718) 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0017_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0017_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0018_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0018_v0_0_s_ifspec;
 
 #ifndef __ICorDebugManagedCallback2_INTERFACE_DEFINED__
 #define __ICorDebugManagedCallback2_INTERFACE_DEFINED__
@@ -3980,14 +4062,14 @@ EXTERN_C const IID IID_ICorDebugManagedCallback2;
 #endif         /* __ICorDebugManagedCallback2_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0018 */
+/* interface __MIDL_itf_cordebug_0000_0019 */
 /* [local] */ 
 
 #pragma warning(pop)
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0018_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0018_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0019_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0019_v0_0_s_ifspec;
 
 #ifndef __ICorDebugUnmanagedCallback_INTERFACE_DEFINED__
 #define __ICorDebugUnmanagedCallback_INTERFACE_DEFINED__
@@ -4071,7 +4153,7 @@ EXTERN_C const IID IID_ICorDebugUnmanagedCallback;
 #endif         /* __ICorDebugUnmanagedCallback_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0019 */
+/* interface __MIDL_itf_cordebug_0000_0020 */
 /* [local] */ 
 
 typedef 
@@ -4091,8 +4173,8 @@ enum CorDebugHandleType
 #pragma warning(disable:28718) 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0019_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0019_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0020_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0020_v0_0_s_ifspec;
 
 #ifndef __ICorDebug_INTERFACE_DEFINED__
 #define __ICorDebug_INTERFACE_DEFINED__
@@ -4280,14 +4362,14 @@ EXTERN_C const IID IID_ICorDebug;
 #endif         /* __ICorDebug_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0020 */
+/* interface __MIDL_itf_cordebug_0000_0021 */
 /* [local] */ 
 
 #pragma warning(pop)
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0020_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0020_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0021_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0021_v0_0_s_ifspec;
 
 #ifndef __ICorDebugRemoteTarget_INTERFACE_DEFINED__
 #define __ICorDebugRemoteTarget_INTERFACE_DEFINED__
@@ -4499,7 +4581,7 @@ EXTERN_C const IID IID_ICorDebugRemote;
 #endif         /* __ICorDebugRemote_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0022 */
+/* interface __MIDL_itf_cordebug_0000_0023 */
 /* [local] */ 
 
 typedef struct _COR_VERSION
@@ -4512,8 +4594,8 @@ typedef struct _COR_VERSION
 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0022_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0022_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0023_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0023_v0_0_s_ifspec;
 
 #ifndef __ICorDebug2_INTERFACE_DEFINED__
 #define __ICorDebug2_INTERFACE_DEFINED__
@@ -4675,7 +4757,7 @@ EXTERN_C const IID IID_ICorDebug2;
 #endif         /* __ICorDebug2_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0023 */
+/* interface __MIDL_itf_cordebug_0000_0024 */
 /* [local] */ 
 
 typedef 
@@ -4687,8 +4769,8 @@ enum CorDebugThreadState
 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0023_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0023_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0024_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0024_v0_0_s_ifspec;
 
 #ifndef __ICorDebugController_INTERFACE_DEFINED__
 #define __ICorDebugController_INTERFACE_DEFINED__
@@ -4870,15 +4952,15 @@ EXTERN_C const IID IID_ICorDebugController;
 #endif         /* __ICorDebugController_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0024 */
+/* interface __MIDL_itf_cordebug_0000_0025 */
 /* [local] */ 
 
 #pragma warning(push)
 #pragma warning(disable:28718) 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0024_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0024_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0025_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0025_v0_0_s_ifspec;
 
 #ifndef __ICorDebugAppDomain_INTERFACE_DEFINED__
 #define __ICorDebugAppDomain_INTERFACE_DEFINED__
@@ -5130,14 +5212,14 @@ EXTERN_C const IID IID_ICorDebugAppDomain;
 #endif         /* __ICorDebugAppDomain_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0025 */
+/* interface __MIDL_itf_cordebug_0000_0026 */
 /* [local] */ 
 
 #pragma warning(pop)
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0025_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0025_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0026_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0026_v0_0_s_ifspec;
 
 #ifndef __ICorDebugAppDomain2_INTERFACE_DEFINED__
 #define __ICorDebugAppDomain2_INTERFACE_DEFINED__
@@ -5635,15 +5717,15 @@ EXTERN_C const IID IID_ICorDebugAppDomain4;
 #endif         /* __ICorDebugAppDomain4_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0029 */
+/* interface __MIDL_itf_cordebug_0000_0030 */
 /* [local] */ 
 
 #pragma warning(push)
 #pragma warning(disable:28718) 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0029_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0029_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0030_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0030_v0_0_s_ifspec;
 
 #ifndef __ICorDebugAssembly_INTERFACE_DEFINED__
 #define __ICorDebugAssembly_INTERFACE_DEFINED__
@@ -5773,14 +5855,14 @@ EXTERN_C const IID IID_ICorDebugAssembly;
 #endif         /* __ICorDebugAssembly_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0030 */
+/* interface __MIDL_itf_cordebug_0000_0031 */
 /* [local] */ 
 
 #pragma warning(pop)
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0030_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0030_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0031_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0031_v0_0_s_ifspec;
 
 #ifndef __ICorDebugAssembly2_INTERFACE_DEFINED__
 #define __ICorDebugAssembly2_INTERFACE_DEFINED__
@@ -5952,7 +6034,7 @@ EXTERN_C const IID IID_ICorDebugAssembly3;
 #endif         /* __ICorDebugAssembly3_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0032 */
+/* interface __MIDL_itf_cordebug_0000_0033 */
 /* [local] */ 
 
 #ifndef _DEF_COR_TYPEID_
@@ -5973,8 +6055,8 @@ typedef struct _COR_HEAPOBJECT
 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0032_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0032_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0033_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0033_v0_0_s_ifspec;
 
 #ifndef __ICorDebugHeapEnum_INTERFACE_DEFINED__
 #define __ICorDebugHeapEnum_INTERFACE_DEFINED__
@@ -6088,7 +6170,7 @@ EXTERN_C const IID IID_ICorDebugHeapEnum;
 #endif         /* __ICorDebugHeapEnum_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0033 */
+/* interface __MIDL_itf_cordebug_0000_0034 */
 /* [local] */ 
 
 typedef 
@@ -6126,8 +6208,8 @@ typedef struct _COR_HEAPINFO
 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0033_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0033_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0034_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0034_v0_0_s_ifspec;
 
 #ifndef __ICorDebugHeapSegmentEnum_INTERFACE_DEFINED__
 #define __ICorDebugHeapSegmentEnum_INTERFACE_DEFINED__
@@ -6241,7 +6323,7 @@ EXTERN_C const IID IID_ICorDebugHeapSegmentEnum;
 #endif         /* __ICorDebugHeapSegmentEnum_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0034 */
+/* interface __MIDL_itf_cordebug_0000_0035 */
 /* [local] */ 
 
 typedef 
@@ -6277,8 +6359,8 @@ typedef struct COR_GC_REFERENCE
 #endif // _DEF_COR_GC_REFERENCE_
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0034_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0034_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0035_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0035_v0_0_s_ifspec;
 
 #ifndef __ICorDebugGCReferenceEnum_INTERFACE_DEFINED__
 #define __ICorDebugGCReferenceEnum_INTERFACE_DEFINED__
@@ -6392,7 +6474,7 @@ EXTERN_C const IID IID_ICorDebugGCReferenceEnum;
 #endif         /* __ICorDebugGCReferenceEnum_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0035 */
+/* interface __MIDL_itf_cordebug_0000_0036 */
 /* [local] */ 
 
 #ifndef _DEF_COR_ARRAY_LAYOUT_
@@ -6437,8 +6519,8 @@ typedef struct COR_FIELD
 #pragma warning(disable:28718) 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0035_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0035_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0036_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0036_v0_0_s_ifspec;
 
 #ifndef __ICorDebugProcess_INTERFACE_DEFINED__
 #define __ICorDebugProcess_INTERFACE_DEFINED__
@@ -6788,14 +6870,14 @@ EXTERN_C const IID IID_ICorDebugProcess;
 #endif         /* __ICorDebugProcess_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0036 */
+/* interface __MIDL_itf_cordebug_0000_0037 */
 /* [local] */ 
 
 #pragma warning(pop)
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0036_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0036_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0037_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0037_v0_0_s_ifspec;
 
 #ifndef __ICorDebugProcess2_INTERFACE_DEFINED__
 #define __ICorDebugProcess2_INTERFACE_DEFINED__
@@ -7239,7 +7321,7 @@ EXTERN_C const IID IID_ICorDebugProcess5;
 #endif         /* __ICorDebugProcess5_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0039 */
+/* interface __MIDL_itf_cordebug_0000_0040 */
 /* [local] */ 
 
 typedef 
@@ -7275,8 +7357,8 @@ enum CorDebugStateChange
 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0039_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0039_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0040_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0040_v0_0_s_ifspec;
 
 #ifndef __ICorDebugDebugEvent_INTERFACE_DEFINED__
 #define __ICorDebugDebugEvent_INTERFACE_DEFINED__
@@ -7368,7 +7450,7 @@ EXTERN_C const IID IID_ICorDebugDebugEvent;
 #endif         /* __ICorDebugDebugEvent_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0040 */
+/* interface __MIDL_itf_cordebug_0000_0041 */
 /* [local] */ 
 
 typedef 
@@ -7390,8 +7472,8 @@ enum CorDebugCodeInvokePurpose
 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0040_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0040_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0041_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0041_v0_0_s_ifspec;
 
 #ifndef __ICorDebugProcess6_INTERFACE_DEFINED__
 #define __ICorDebugProcess6_INTERFACE_DEFINED__
@@ -7539,7 +7621,7 @@ EXTERN_C const IID IID_ICorDebugProcess6;
 #endif         /* __ICorDebugProcess6_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0041 */
+/* interface __MIDL_itf_cordebug_0000_0042 */
 /* [local] */ 
 
 typedef 
@@ -7551,8 +7633,8 @@ enum WriteableMetadataUpdateMode
 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0041_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0041_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0042_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0042_v0_0_s_ifspec;
 
 #ifndef __ICorDebugProcess7_INTERFACE_DEFINED__
 #define __ICorDebugProcess7_INTERFACE_DEFINED__
@@ -7714,88 +7796,6 @@ EXTERN_C const IID IID_ICorDebugProcess8;
 #endif         /* __ICorDebugProcess8_INTERFACE_DEFINED__ */
 
 
-#ifndef __ICorDebugProcess9_INTERFACE_DEFINED__
-#define __ICorDebugProcess9_INTERFACE_DEFINED__
-
-/* interface ICorDebugProcess9 */
-/* [unique][uuid][local][object] */ 
-
-
-EXTERN_C const IID IID_ICorDebugProcess9;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-    
-    MIDL_INTERFACE("CB54E392-C6DD-47BE-9C60-A99F3ECE3A98")
-    ICorDebugProcess9 : public IUnknown
-    {
-    public:
-        virtual HRESULT STDMETHODCALLTYPE CreateBreakpoint( 
-            /* [in] */ CORDB_ADDRESS address,
-            /* [out] */ ICorDebugValueBreakpoint **ppBreakpoint) = 0;
-        
-    };
-    
-    
-#else  /* C style interface */
-
-    typedef struct ICorDebugProcess9Vtbl
-    {
-        BEGIN_INTERFACE
-        
-        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
-            ICorDebugProcess9 * This,
-            /* [in] */ REFIID riid,
-            /* [annotation][iid_is][out] */ 
-            _COM_Outptr_  void **ppvObject);
-        
-        ULONG ( STDMETHODCALLTYPE *AddRef )( 
-            ICorDebugProcess9 * This);
-        
-        ULONG ( STDMETHODCALLTYPE *Release )( 
-            ICorDebugProcess9 * This);
-        
-        HRESULT ( STDMETHODCALLTYPE *CreateBreakpoint )( 
-            ICorDebugProcess9 * This,
-            /* [in] */ CORDB_ADDRESS address,
-            /* [out] */ ICorDebugValueBreakpoint **ppBreakpoint);
-        
-        END_INTERFACE
-    } ICorDebugProcess9Vtbl;
-
-    interface ICorDebugProcess9
-    {
-        CONST_VTBL struct ICorDebugProcess9Vtbl *lpVtbl;
-    };
-
-    
-
-#ifdef COBJMACROS
-
-
-#define ICorDebugProcess9_QueryInterface(This,riid,ppvObject)  \
-    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 
-
-#define ICorDebugProcess9_AddRef(This) \
-    ( (This)->lpVtbl -> AddRef(This) ) 
-
-#define ICorDebugProcess9_Release(This)        \
-    ( (This)->lpVtbl -> Release(This) ) 
-
-
-#define ICorDebugProcess9_CreateBreakpoint(This,address,ppBreakpoint)  \
-    ( (This)->lpVtbl -> CreateBreakpoint(This,address,ppBreakpoint) ) 
-
-#endif /* COBJMACROS */
-
-
-#endif         /* C style interface */
-
-
-
-
-#endif         /* __ICorDebugProcess9_INTERFACE_DEFINED__ */
-
-
 #ifndef __ICorDebugModuleDebugEvent_INTERFACE_DEFINED__
 #define __ICorDebugModuleDebugEvent_INTERFACE_DEFINED__
 
@@ -12213,7 +12213,7 @@ EXTERN_C const IID IID_ICorDebugFunction3;
 
 
 
-#endif  /* __ICorDebugFunction3_INTERFACE_DEFINED__ */
+#endif         /* __ICorDebugFunction3_INTERFACE_DEFINED__ */
 
 
 #ifndef __ICorDebugFunction4_INTERFACE_DEFINED__
@@ -12237,7 +12237,7 @@ EXTERN_C const IID IID_ICorDebugFunction4;
     };
     
     
-#else   /* C style interface */
+#else  /* C style interface */
 
     typedef struct ICorDebugFunction4Vtbl
     {
@@ -12272,29 +12272,28 @@ EXTERN_C const IID IID_ICorDebugFunction4;
 #ifdef COBJMACROS
 
 
-#define ICorDebugFunction4_QueryInterface(This,riid,ppvObject)  \
+#define ICorDebugFunction4_QueryInterface(This,riid,ppvObject) \
     ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 
 
-#define ICorDebugFunction4_AddRef(This) \
+#define ICorDebugFunction4_AddRef(This)        \
     ( (This)->lpVtbl -> AddRef(This) ) 
 
-#define ICorDebugFunction4_Release(This)    \
+#define ICorDebugFunction4_Release(This)       \
     ( (This)->lpVtbl -> Release(This) ) 
 
 
-#define ICorDebugFunction4_CreateNativeBreakpoint(This,ppBreakpoint)    \
+#define ICorDebugFunction4_CreateNativeBreakpoint(This,ppBreakpoint)   \
     ( (This)->lpVtbl -> CreateNativeBreakpoint(This,ppBreakpoint) ) 
 
 #endif /* COBJMACROS */
 
 
-#endif  /* C style interface */
-
+#endif         /* C style interface */
 
 
 
-#endif  /* __ICorDebugFunction4_INTERFACE_DEFINED__ */
 
+#endif         /* __ICorDebugFunction4_INTERFACE_DEFINED__ */
 
 
 #ifndef __ICorDebugCode_INTERFACE_DEFINED__
@@ -14700,15 +14699,15 @@ EXTERN_C const IID IID_ICorDebugBoxValue;
 #endif         /* __ICorDebugBoxValue_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0097 */
+/* interface __MIDL_itf_cordebug_0000_0098 */
 /* [local] */ 
 
 #pragma warning(push)
 #pragma warning(disable:28718) 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0097_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0097_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0098_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0098_v0_0_s_ifspec;
 
 #ifndef __ICorDebugStringValue_INTERFACE_DEFINED__
 #define __ICorDebugStringValue_INTERFACE_DEFINED__
@@ -14848,14 +14847,14 @@ EXTERN_C const IID IID_ICorDebugStringValue;
 #endif         /* __ICorDebugStringValue_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0098 */
+/* interface __MIDL_itf_cordebug_0000_0099 */
 /* [local] */ 
 
 #pragma warning(pop)
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0098_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0098_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0099_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0099_v0_0_s_ifspec;
 
 #ifndef __ICorDebugArrayValue_INTERFACE_DEFINED__
 #define __ICorDebugArrayValue_INTERFACE_DEFINED__
@@ -17630,15 +17629,15 @@ EXTERN_C const IID IID_ICorDebugBlockingObjectEnum;
 #endif         /* __ICorDebugBlockingObjectEnum_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0122 */
+/* interface __MIDL_itf_cordebug_0000_0123 */
 /* [local] */ 
 
 #pragma warning(push)
 #pragma warning(disable:28718)
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0122_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0122_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0123_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0123_v0_0_s_ifspec;
 
 #ifndef __ICorDebugMDA_INTERFACE_DEFINED__
 #define __ICorDebugMDA_INTERFACE_DEFINED__
@@ -17778,7 +17777,7 @@ EXTERN_C const IID IID_ICorDebugMDA;
 #endif         /* __ICorDebugMDA_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0123 */
+/* interface __MIDL_itf_cordebug_0000_0124 */
 /* [local] */ 
 
 #pragma warning(pop)
@@ -17786,8 +17785,8 @@ EXTERN_C const IID IID_ICorDebugMDA;
 #pragma warning(disable:28718) 
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0123_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0123_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0124_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0124_v0_0_s_ifspec;
 
 #ifndef __ICorDebugEditAndContinueErrorInfo_INTERFACE_DEFINED__
 #define __ICorDebugEditAndContinueErrorInfo_INTERFACE_DEFINED__
@@ -17903,14 +17902,14 @@ EXTERN_C const IID IID_ICorDebugEditAndContinueErrorInfo;
 #endif         /* __ICorDebugEditAndContinueErrorInfo_INTERFACE_DEFINED__ */
 
 
-/* interface __MIDL_itf_cordebug_0000_0124 */
+/* interface __MIDL_itf_cordebug_0000_0125 */
 /* [local] */ 
 
 #pragma warning(pop)
 
 
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0124_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0124_v0_0_s_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0125_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_cordebug_0000_0125_v0_0_s_ifspec;
 
 #ifndef __ICorDebugEditAndContinueSnapshot_INTERFACE_DEFINED__
 #define __ICorDebugEditAndContinueSnapshot_INTERFACE_DEFINED__
index cea4c88..71af1b4 100644 (file)
@@ -408,6 +408,9 @@ public:
     virtual void EnumMemoryRegions(CLRDataEnumMemoryFlags flags) = 0;
     virtual void EnumMemoryRegionsIfFuncEvalFrame(CLRDataEnumMemoryFlags flags, Frame * pFrame) = 0;
 #endif
+#ifndef DACCESS_COMPILE
+    virtual void SomeWork() = 0;
+#endif
 };
 
 #ifndef DACCESS_COMPILE
index daadc91..ab05d63 100644 (file)
@@ -99,7 +99,6 @@ UINT_PTR FindMostRecentUserCodeOnStack(void)
     return address;
 }
 
-
 // This does a user break, triggered by System.Diagnostics.Debugger.Break, or the IL opcode for break.
 //
 // Notes:
index 34645b3..41814d8 100644 (file)
@@ -20,6 +20,9 @@ void GCToEEInterface::SuspendEE(SUSPEND_REASON reason)
 
     _ASSERTE(reason == SUSPEND_FOR_GC || reason == SUSPEND_FOR_GC_PREP);
 
+    // TODO, between the time when the debug event is sent and the EE is suspended, there is a small window that the data breakpoint could have already hit
+    g_pDebugInterface->SomeWork();
+
     ThreadSuspend::SuspendEE((ThreadSuspend::SUSPEND_REASON)reason);
 }
 
@@ -727,7 +730,7 @@ void GCToEEInterface::DiagGCStart(int gen, bool isInduced)
         END_PIN_PROFILER();
     }
 
-#endif // GC_PROFILING
+#endif // GC_PROFILING    
 }
 
 void GCToEEInterface::DiagUpdateGenerationBounds()