Passing the CONTEXT in ICorDebugManagedCallback4::DataBreakpoint
authorAndrew Au <andrewau@microsoft.com>
Thu, 8 Nov 2018 18:55:00 +0000 (10:55 -0800)
committerAndrew Au <cshung@gmail.com>
Fri, 9 Nov 2018 02:51:34 +0000 (18:51 -0800)
src/debug/di/process.cpp
src/debug/di/rsmain.cpp
src/debug/di/shimcallback.cpp
src/debug/di/shimpriv.h
src/debug/ee/controller.h
src/debug/ee/debugger.cpp
src/debug/inc/dbgipcevents.h
src/debug/shared/dbgtransportsession.cpp
src/inc/cordebug.idl
src/pal/prebuilt/inc/cordebug.h

index a5116f7..cad2c9b 100644 (file)
@@ -4922,7 +4922,7 @@ void CordbProcess::RawDispatchEvent(
         
             {
                 PUBLIC_CALLBACK_IN_THIS_SCOPE(this, pLockHolder, pEvent);
-                pCallback4->DataBreakpoint(static_cast<ICorDebugProcess*>(this), pThread);
+                pCallback4->DataBreakpoint(static_cast<ICorDebugProcess*>(this), pThread, reinterpret_cast<BYTE*>(&(pEvent->DataBreakpointData.context)), sizeof(CONTEXT));
             }
             break;
         }
index 8f26de0..750cb1d 100644 (file)
@@ -870,7 +870,7 @@ namespace
         virtual ULONG STDMETHODCALLTYPE Release();
         COM_METHOD BeforeGarbageCollection(ICorDebugProcess* pProcess);
         COM_METHOD AfterGarbageCollection(ICorDebugProcess* pProcess);
-        COM_METHOD DataBreakpoint(ICorDebugProcess* pProcess, ICorDebugThread* pThread);
+        COM_METHOD DataBreakpoint(ICorDebugProcess* pProcess, ICorDebugThread* pThread, BYTE* pContext, ULONG32 contextSize);
     private:
         // not implemented
         DefaultManagedCallback4(const DefaultManagedCallback4&);
@@ -944,7 +944,7 @@ namespace
     }
 
     HRESULT
-        DefaultManagedCallback4::DataBreakpoint(ICorDebugProcess* pProcess, ICorDebugThread* pThread)
+        DefaultManagedCallback4::DataBreakpoint(ICorDebugProcess* pProcess, ICorDebugThread* pThread, BYTE* pContext, ULONG32 contextSize)
     {
         //
         // Just ignore and continue the process.
index 1af6e04..84ee345 100644 (file)
@@ -1384,7 +1384,7 @@ HRESULT ShimProxyCallback::AfterGarbageCollection(ICorDebugProcess* pProcess)
 //      input:
 //          pProcess - process in which the notification occurred
 // Return value: S_OK
-HRESULT ShimProxyCallback::DataBreakpoint(ICorDebugProcess* pProcess, ICorDebugThread* pThread)
+HRESULT ShimProxyCallback::DataBreakpoint(ICorDebugProcess* pProcess, ICorDebugThread* pThread, BYTE* pContext, ULONG32 contextSize)
 {
     m_pShim->PreDispatchEvent();
     class DataBreakpointEvent : public ManagedEvent
@@ -1392,23 +1392,27 @@ HRESULT ShimProxyCallback::DataBreakpoint(ICorDebugProcess* pProcess, ICorDebugT
         // callbacks parameters. These are strong references
         RSExtSmartPtr<ICorDebugProcess> m_pProcess;
         RSExtSmartPtr<ICorDebugThread> m_pThread;
+        BYTE* m_pContext;
+        ULONG32 m_contextSize;
 
     public:
         // Ctor
-        DataBreakpointEvent(ICorDebugProcess* pProcess, ICorDebugThread* pThread) :
+        DataBreakpointEvent(ICorDebugProcess* pProcess, ICorDebugThread* pThread, BYTE* pContext, ULONG32 contextSize) :
             ManagedEvent()
         {
             this->m_pProcess.Assign(pProcess);
             this->m_pThread.Assign(pThread);
+            this->m_pContext = pContext;
+            this->m_contextSize = contextSize;
         }
 
         HRESULT Dispatch(DispatchArgs args)
         {
-            return args.GetCallback4()->DataBreakpoint(m_pProcess, m_pThread);
+            return args.GetCallback4()->DataBreakpoint(m_pProcess, m_pThread, m_pContext, m_contextSize);
         }
     }; // end class AfterGarbageCollectionEvent
 
-    m_pShim->GetManagedEventQueue()->QueueEvent(new DataBreakpointEvent(pProcess, pThread));
+    m_pShim->GetManagedEventQueue()->QueueEvent(new DataBreakpointEvent(pProcess, pThread, pContext, contextSize));
     return S_OK;
 }
 
index 97cbeb7..4c9eb7a 100644 (file)
@@ -222,7 +222,7 @@ public:
     COM_METHOD ShimProxyCallback::AfterGarbageCollection(ICorDebugProcess* pProcess);
 
     // Implementation of ICorDebugManagedCallback4::DataBreakpoint
-    COM_METHOD ShimProxyCallback::DataBreakpoint(ICorDebugProcess* pProcess, ICorDebugThread* pThread);
+    COM_METHOD ShimProxyCallback::DataBreakpoint(ICorDebugProcess* pProcess, ICorDebugThread* pThread, BYTE* pContext, ULONG32 contextSize);
 };
 
 
index 1e002bc..7643b36 100644 (file)
@@ -1793,20 +1793,6 @@ public:
                               Thread *thread, 
                               TRIGGER_WHY tyWhy)
     {
-#ifdef FEATURE_PAL    
-        #error Not supported
-#endif // FEATURE_PAL
-#if defined(_TARGET_X86_) || defined(_TARGET_AMD64_)
-        CONTEXT *context = g_pEEInterface->GetThreadFilterContext(thread);
-        context->Dr0 = this->m_context.Dr0;
-        context->Dr1 = this->m_context.Dr1;
-        context->Dr2 = this->m_context.Dr2;
-        context->Dr3 = this->m_context.Dr3;
-        context->Dr6 = this->m_context.Dr6;
-        context->Dr7 = this->m_context.Dr7;
-#else // defined(_TARGET_X86_) || defined(_TARGET_AMD64_)
-        #error Not supported
-#endif // defined(_TARGET_X86_) || defined(_TARGET_AMD64_)
         return TPR_TRIGGER;
     }
 
@@ -1822,9 +1808,7 @@ public:
 
         LOG((LF_CORDB, LL_INFO10000, "DDBP::SE: in DebuggerDataBreakpoint's SendEvent\n"));
 
-        CONTEXT *context = g_pEEInterface->GetThreadFilterContext(thread);
-
-        g_pDebugger->SendDataBreakpoint(thread, context, this);
+        g_pDebugger->SendDataBreakpoint(thread, &m_context, this);
 
         Delete();
 
index 8f8b664..c6fb419 100644 (file)
@@ -6112,6 +6112,7 @@ void Debugger::SendDataBreakpoint(Thread *thread, CONTEXT *context,
 
     // Send a breakpoint event to the Right Side
     DebuggerIPCEvent* ipce = m_pRCThread->GetIPCEventSendBuffer();
+    memcpy(&(ipce->DataBreakpointData.context), context, sizeof(CONTEXT));
     InitIPCEvent(ipce,
         DB_IPCE_DATA_BREAKPOINT,
         thread,
index 279cd8f..e9669f0 100644 (file)
@@ -2012,6 +2012,11 @@ struct MSLAYOUT DebuggerIPCEvent
 
         struct MSLAYOUT
         {
+            CONTEXT context;
+        } DataBreakpointData;
+
+        struct MSLAYOUT
+        {
             LSPTR_STEPPER        stepperToken;
             VMPTR_Thread         vmThreadToken;
             FramePointer         frameToken;
index e9d77cb..f526f91 100644 (file)
@@ -2201,10 +2201,12 @@ DWORD DbgTransportSession::GetEventSize(DebuggerIPCEvent *pEvent)
     case DB_IPCE_ATTACHING:
     case DB_IPCE_GET_NGEN_COMPILER_FLAGS:
     case DB_IPCE_DETACH_FROM_PROCESS:
-    case DB_IPCE_CONTROL_C_EVENT_RESULT:
-    case DB_IPCE_DATA_BREAKPOINT:
+    case DB_IPCE_CONTROL_C_EVENT_RESULT:    
         cbAdditionalSize = 0;
         break;
+    case DB_IPCE_DATA_BREAKPOINT:
+        cbAdditionalSize = sizeof(pEvent->DataBreakpointData);
+        break;
 
     case DB_IPCE_BREAKPOINT:
         cbAdditionalSize = sizeof(pEvent->BreakpointData);
index 254a7db..ce1bf4a 100644 (file)
@@ -1385,13 +1385,15 @@ interface ICorDebugManagedCallback4 : IUnknown
     // Callback indicating a data breakpoint is hit
     // 
     // Parameters
-    //   pProcess - the process that hits the data breakpoint
-    //   pThread  - the thread that hits the data breakpoint
+    //   pProcess    - the process that hits the data breakpoint
+    //   pThread     - the thread that hits the data breakpoint
+    //   pContext    - a pointer to the CONTEXT structure
+    //   contextSize - the size of the CONTEXT structure
     // 
     // Returns
     //   S_OK - on success
     //
-    HRESULT DataBreakpoint([in] ICorDebugProcess* pProcess, [in] ICorDebugThread* pThread);
+    HRESULT DataBreakpoint([in] ICorDebugProcess* pProcess, [in] ICorDebugThread* pThread, [in] BYTE* pContext, [in] ULONG32 contextSize);
 }
 
 #pragma warning(disable:28718) /* disable warning 28718 for interface ICorDebugManagedCallback2 */
index 1b53577..a974257 100644 (file)
@@ -3788,7 +3788,9 @@ EXTERN_C const IID IID_ICorDebugManagedCallback4;
         
         virtual HRESULT STDMETHODCALLTYPE DataBreakpoint( 
             /* [in] */ ICorDebugProcess *pProcess,
-            /* [in] */ ICorDebugThread *pThread) = 0;
+            /* [in] */ ICorDebugThread *pThread,
+            /* [in] */ BYTE *pContext,
+            /* [in] */ ULONG32 contextSize) = 0;
         
     };
     
@@ -3822,7 +3824,9 @@ EXTERN_C const IID IID_ICorDebugManagedCallback4;
         HRESULT ( STDMETHODCALLTYPE *DataBreakpoint )( 
             ICorDebugManagedCallback4 * This,
             /* [in] */ ICorDebugProcess *pProcess,
-            /* [in] */ ICorDebugThread *pThread);
+            /* [in] */ ICorDebugThread *pThread,
+            /* [in] */ BYTE *pContext,
+            /* [in] */ ULONG32 contextSize);
         
         END_INTERFACE
     } ICorDebugManagedCallback4Vtbl;
@@ -3853,8 +3857,8 @@ EXTERN_C const IID IID_ICorDebugManagedCallback4;
 #define ICorDebugManagedCallback4_AfterGarbageCollection(This,pProcess)        \
     ( (This)->lpVtbl -> AfterGarbageCollection(This,pProcess) ) 
 
-#define ICorDebugManagedCallback4_DataBreakpoint(This,pProcess,pThread)        \
-    ( (This)->lpVtbl -> DataBreakpoint(This,pProcess,pThread) ) 
+#define ICorDebugManagedCallback4_DataBreakpoint(This,pProcess,pThread,pContext,contextSize)   \
+    ( (This)->lpVtbl -> DataBreakpoint(This,pProcess,pThread,pContext,contextSize) ) 
 
 #endif /* COBJMACROS */