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 c68701f71d5..398aec6bc86 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 @@ -764,6 +764,11 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo final Map> threadsIDs = fBreakpointThreads.get(dmc); assert threadsIDs != null; + // Remove all relevant target filters + // Note that this call is important if a breakpoint is removed directly + // from the gdb console, or else we will try to re-install it (bug 433044) + removeAllTargetFilters(dmc, breakpoint); + // Remove breakpoint problem marker (if any) removeBreakpointProblemMarker(breakpoint); @@ -1506,6 +1511,19 @@ public class MIBreakpointsManager extends AbstractDsfService implements IBreakpo } } + private void removeAllTargetFilters(IBreakpointsTargetDMContext bpTargetDmc, ICBreakpoint breakpoint) { + try { + IDsfBreakpointExtension filterExt = getFilterExtension(breakpoint); + IContainerDMContext[] targets = filterExt.getTargetFilters(); + for (IContainerDMContext target : targets) { + if (bpTargetDmc.equals(target) || DMContexts.isAncestorOf(target, bpTargetDmc)) { + filterExt.removeTargetFilter(target); + } + } + } catch (CoreException e) { + } + } + //------------------------------------------------------------------------- // Session exit //------------------------------------------------------------------------- diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/GDBConsoleBreakpointsTest.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/GDBConsoleBreakpointsTest.java index 8cd9eaf6c5e..c189091647e 100644 --- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/GDBConsoleBreakpointsTest.java +++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/GDBConsoleBreakpointsTest.java @@ -288,6 +288,14 @@ public class GDBConsoleBreakpointsTest extends BaseTestCase { plBpt = findPlatformBreakpoint(type, attributes); Assert.assertTrue(plBpt instanceof CBreakpoint); waitForInstallCountChange((CBreakpoint)plBpt, 0); + + // Make sure the breakpoint does not get re-installed + // once it gets a notification that the platform bp changed + // (through its install count changing) Bug 433044 + // Give it some time and verify that it is still 0. + Thread.sleep(3000); // One second was not enough + Assert.assertTrue("Install count no longer 0", + ((CBreakpoint)plBpt).getInstallCount() == 0); // Set the console breakpoint again and verify that // the install count of the platform breakpoint is 1