diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java index 002d7cc8a8f..b2bb4d019d1 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java @@ -50,6 +50,7 @@ import org.eclipse.cdt.dsf.mi.service.command.events.MIBreakpointHitEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIInferiorExitEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIRunningEvent; +import org.eclipse.cdt.dsf.mi.service.command.events.MISignalEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIStoppedEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadExitEvent; import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo; @@ -384,7 +385,17 @@ public class GDBRunControl extends MIRunControl { @Override @DsfServiceEventHandler public void eventDispatched(final MIStoppedEvent e) { - if (processRunToLineStoppedEvent(e)) { + // A disabled signal event is due to interrupting the target + // to set a breakpoint. This can happen during a run-to-line + // or step-into operation, so we need to check it first. + if (fDisableNextSignalEvent && e instanceof MISignalEvent) { + fDisableNextSignalEvent = false; + fSilencedSignalEvent = e; + // We don't broadcast this stopped event + return; + } + + if (processRunToLineStoppedEvent(e)) { // If RunToLine is not completed return; } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java index 42cf51abf7f..ff3c6a446ad 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java @@ -1549,6 +1549,16 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo */ @DsfServiceEventHandler public void eventDispatched(final MIStoppedEvent e) { + // A disabled signal event is due to interrupting the target + // to set a breakpoint. This can happen during a run-to-line + // or step-into operation, so we need to check it first. + IMIExecutionDMContext threadDmc = DMContexts.getAncestorOfType(e.getDMContext(), IMIExecutionDMContext.class); + if (e instanceof MISignalEvent && fDisableNextSignalEventDmcSet.remove(threadDmc)) { + fSilencedSignalEventMap.put(threadDmc, e); + // Don't broadcast the stopped event + return; + } + if (processRunToLineStoppedEvent(e)) { // If RunToLine is not completed return; @@ -1561,13 +1571,6 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo } private void broadcastStop(final MIStoppedEvent e) { - IMIExecutionDMContext threadDmc = DMContexts.getAncestorOfType(e.getDMContext(), IMIExecutionDMContext.class); - if (e instanceof MISignalEvent && fDisableNextSignalEventDmcSet.remove(threadDmc)) { - fSilencedSignalEventMap.put(threadDmc, e); - // Don't broadcast the stopped event - return; - } - IDMEvent event = null; MIBreakpointDMContext bp = null; if (e instanceof MIBreakpointHitEvent) { diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java index 71c39729009..1485b45e880 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java @@ -406,13 +406,15 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I protected boolean fDisableNextRunningEvent; /** * Indicates that the next MISignal (MIStopped) event should be silenced. + * @since 4.3 */ - private boolean fDisableNextSignalEvent; + protected boolean fDisableNextSignalEvent; /** * Stores the silenced MIStopped event in case we need to use it * for a failure. + * @since 4.3 */ - private MIStoppedEvent fSilencedSignalEvent; + protected MIStoppedEvent fSilencedSignalEvent; private static final int FAKE_THREAD_ID = 0;