From cee8719e102e92bcc1b1bd0219ebeb1ea8348474 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Tue, 16 Sep 2014 12:21:06 -0400 Subject: [PATCH] Bug 442394 - Sometimes breakpoints set and immediately deleted when debugging with GDB Change-Id: I4cdc2bfc50ce846fc3175e633b2d27510ba65e82 Signed-off-by: Marc Khouzam Reviewed-on: https://git.eclipse.org/r/33458 Tested-by: Hudson CI Reviewed-by: Alvaro Sanchez-Leon --- .../META-INF/MANIFEST.MF | 2 +- dsf-gdb/org.eclipse.cdt.dsf.gdb/pom.xml | 2 +- .../gdb/service/DebugNewProcessSequence.java | 4 +- .../cdt/dsf/gdb/service/GDBProcesses.java | 4 +- .../cdt/dsf/gdb/service/GDBProcesses_7_0.java | 3 +- .../cdt/dsf/gdb/service/GDBProcesses_7_2.java | 3 +- .../dsf/mi/service/MIBreakpointsManager.java | 43 ++++++++++++++----- .../core/GDBJtagDSFFinalLaunchSequence.java | 4 +- 8 files changed, 41 insertions(+), 24 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/META-INF/MANIFEST.MF b/dsf-gdb/org.eclipse.cdt.dsf.gdb/META-INF/MANIFEST.MF index 9629b8d2f97..55913450d90 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/META-INF/MANIFEST.MF +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-SymbolicName: org.eclipse.cdt.dsf.gdb;singleton:=true -Bundle-Version: 4.5.0.qualifier +Bundle-Version: 4.6.0.qualifier Bundle-Activator: org.eclipse.cdt.dsf.gdb.internal.GdbPlugin Bundle-Localization: plugin Require-Bundle: org.eclipse.core.runtime, diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/pom.xml b/dsf-gdb/org.eclipse.cdt.dsf.gdb/pom.xml index 39b52bb7936..42bbfe90090 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/pom.xml +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/pom.xml @@ -11,7 +11,7 @@ ../../pom.xml - 4.5.0-SNAPSHOT + 4.6.0-SNAPSHOT org.eclipse.cdt.dsf.gdb eclipse-plugin diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/DebugNewProcessSequence.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/DebugNewProcessSequence.java index 0d06a83ebc5..8bac76f5682 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/DebugNewProcessSequence.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/DebugNewProcessSequence.java @@ -27,7 +27,6 @@ import org.eclipse.cdt.dsf.concurrent.ReflectionSequence; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.IDMContext; -import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext; import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants; @@ -438,8 +437,7 @@ public class DebugNewProcessSequence extends ReflectionSequence { public void stepStartTrackingBreakpoints(RequestMonitor rm) { if (fBackend.getSessionType() != SessionType.CORE) { MIBreakpointsManager bpmService = fTracker.getService(MIBreakpointsManager.class); - IBreakpointsTargetDMContext bpTargetDmc = DMContexts.getAncestorOfType(getContainerContext(), IBreakpointsTargetDMContext.class); - bpmService.startTrackingBreakpoints(bpTargetDmc, rm); + bpmService.startTrackingBpForProcess(getContainerContext(), rm); } else { rm.done(); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java index ffa1d165f6a..407fed1b504 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java @@ -271,8 +271,8 @@ public class GDBProcesses extends MIProcesses implements IGDBProcesses { @Override public void execute(RequestMonitor trackBpRm) { MIBreakpointsManager bpmService = getServicesTracker().getService(MIBreakpointsManager.class); - IBreakpointsTargetDMContext bpTargetDmc = DMContexts.getAncestorOfType(ctx, IBreakpointsTargetDMContext.class); - bpmService.startTrackingBreakpoints(bpTargetDmc, trackBpRm); + IContainerDMContext containerDmc = DMContexts.getAncestorOfType(ctx, IContainerDMContext.class); + bpmService.startTrackingBpForProcess(containerDmc, trackBpRm); }; } }; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java index 8317be114bf..6ffd8373a01 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java @@ -928,8 +928,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService public void execute(RequestMonitor rm) { // Start tracking breakpoints. MIBreakpointsManager bpmService = getServicesTracker().getService(MIBreakpointsManager.class); - IBreakpointsTargetDMContext bpTargetDmc = DMContexts.getAncestorOfType(fContainerDmc, IBreakpointsTargetDMContext.class); - bpmService.startTrackingBreakpoints(bpTargetDmc, rm); + bpmService.startTrackingBpForProcess(fContainerDmc, rm); } }, // Turn on reverse debugging if it was enabled as a launch option diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java index 99f2b02c162..3f1efde95a2 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java @@ -331,8 +331,7 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 { @Override public void execute(RequestMonitor rm) { MIBreakpointsManager bpmService = getServicesTracker().getService(MIBreakpointsManager.class); - IBreakpointsTargetDMContext bpTargetDmc = DMContexts.getAncestorOfType(fContainerDmc, IBreakpointsTargetDMContext.class); - bpmService.startTrackingBreakpoints(bpTargetDmc, rm); + bpmService.startTrackingBpForProcess(fContainerDmc, rm); } }, // Turn on reverse debugging if it was enabled as a launch option diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIBreakpointsManager.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIBreakpointsManager.java index d7b4bb1f368..1641bf1b904 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIBreakpointsManager.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIBreakpointsManager.java @@ -346,6 +346,38 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo // IBreakpointsManager /////////////////////////////////////////////////////////////////////////// + /** + * Wrapper around startTrackingBreakpoints() which accepts a containerDmc and sets + * each breakpoints filter to include that container. This method should be called + * instead of startTrackingBreakpoints() + * + * @param containerDmc The container to be added in the bp filter. This container + * must have the proper IBreakpointsTargetDMContext in its hierarchy. + * + * @since 4.6 + */ + public void startTrackingBpForProcess(final IContainerDMContext containerDmc, final RequestMonitor rm) { + final IBreakpointsTargetDMContext targetBpDmc = DMContexts.getAncestorOfType(containerDmc, IBreakpointsTargetDMContext.class); + + startTrackingBreakpoints(targetBpDmc, new ImmediateRequestMonitor(rm) { + @Override + protected void handleSuccess() { + final Map> platformBPs = fPlatformBPs.get(targetBpDmc); + if (platformBPs == null) { + assert false; + rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INTERNAL_ERROR, "Missing bp target context", null)); //$NON-NLS-1$ + return; + } + + for (final ICBreakpoint breakpoint : platformBPs.keySet()) { + setTargetFilter(breakpoint, containerDmc); + } + + rm.done(); + } + }); + } + //------------------------------------------------------------------------- // startTrackingBreakpoints //------------------------------------------------------------------------- @@ -1480,15 +1512,6 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo */ @DsfServiceEventHandler public void eventDispatched(IStartedDMEvent e) { - if (e.getDMContext() instanceof IContainerDMContext) { - // Process started, add it to the thread filtering of all breakpoints - IBreakpoint[] allBreakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(fDebugModelId); - for (IBreakpoint bp : allBreakpoints) { - if (supportsBreakpoint(bp)) { - setTargetFilter((ICBreakpoint)bp, (IContainerDMContext)e.getDMContext()); - } - } - } } @@ -1499,7 +1522,7 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo // Do this only if there wasn't already an entry, or else we would // erase the content of that previous entry. // This could theoretically happen if the targetFilter is set by - // someone else, before the IStartedDMEvent arrives indicating a new process. + // someone else, before this method is called. // Bug 433339 filterExt.setTargetFilter(containerDmc); } diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDSFFinalLaunchSequence.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDSFFinalLaunchSequence.java index e7b7d64d453..0748f392126 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDSFFinalLaunchSequence.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDSFFinalLaunchSequence.java @@ -46,7 +46,6 @@ import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress; import org.eclipse.cdt.dsf.datamodel.DMContexts; -import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext; import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext; import org.eclipse.cdt.dsf.gdb.launching.FinalLaunchSequence; import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch; @@ -533,8 +532,7 @@ public class GDBJtagDSFFinalLaunchSequence extends FinalLaunchSequence { @Execute public void stepStartTrackingBreakpoints(final RequestMonitor rm) { MIBreakpointsManager bpmService = fTracker.getService(MIBreakpointsManager.class); - IBreakpointsTargetDMContext bpTargetDmc = DMContexts.getAncestorOfType(getContainerContext(), IBreakpointsTargetDMContext.class); - bpmService.startTrackingBreakpoints(bpTargetDmc, rm); + bpmService.startTrackingBpForProcess(getContainerContext(), rm); } /*