From b985a7fc54910e6567a953f99c6842c1c361b781 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Thu, 17 Apr 2014 16:20:09 -0400 Subject: [PATCH] Bug 433044 - Deleting a bp from gdb console causes it to be re-installed Change-Id: I3e7b26bc31104fc8ef12c1330c0a0ff2125da8ae Signed-off-by: Marc Khouzam Reviewed-on: https://git.eclipse.org/r/25266 Tested-by: Hudson CI Reviewed-by: Mikhail Khodjaiants Tested-by: Mikhail Khodjaiants --- .../dsf/mi/service/MIBreakpointsManager.java | 18 ++++++++++++++++++ .../gdb/tests/GDBConsoleBreakpointsTest.java | 8 ++++++++ 2 files changed, 26 insertions(+) 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