diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java index e80574e02498..845ec4399bbf 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java @@ -509,7 +509,7 @@ public class DebugProcessEvents extends DebugProcessImpl { if (event == null || vm == event.virtualMachine()) { try { preprocessEvent(suspendContext, null); - cancelRunToCursorBreakpoint(); + cancelSteppingBreakpoints(); } finally { DebuggerEventThread eventThread = myEventThreads.get(vm); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index cbc7a0689e06..ef415d9cc177 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -918,22 +918,23 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb myPositionManager.appendPositionManager(positionManager); } - private volatile SteppingBreakpoint mySteppingBreakpoint; + private final List mySteppingBreakpoints = new ArrayList<>(); - public void setSteppingBreakpoint(@Nullable SteppingBreakpoint breakpoint) { - mySteppingBreakpoint = breakpoint; + public void setSteppingBreakpoint(@NotNull SteppingBreakpoint breakpoint) { + mySteppingBreakpoints.add(breakpoint); } - public void cancelRunToCursorBreakpoint() { + public void cancelSteppingBreakpoints() { DebuggerManagerThreadImpl.assertIsManagerThread(); - final SteppingBreakpoint runToCursorBreakpoint = mySteppingBreakpoint; - if (runToCursorBreakpoint != null) { - setSteppingBreakpoint(null); + boolean isRestoreBreakpoints = false; + for (SteppingBreakpoint runToCursorBreakpoint : mySteppingBreakpoints) { getRequestsManager().deleteRequest(runToCursorBreakpoint); - if (runToCursorBreakpoint.isRestoreBreakpoints()) { - DebuggerManagerEx.getInstanceEx(getProject()).getBreakpointManager().enableBreakpoints(this); - } + isRestoreBreakpoints |= runToCursorBreakpoint.isRestoreBreakpoints(); } + if (isRestoreBreakpoints) { + DebuggerManagerEx.getInstanceEx(getProject()).getBreakpointManager().enableBreakpoints(this); + } + mySteppingBreakpoints.clear(); } public static void prepareAndSetSteppingBreakpoint(SuspendContextImpl context, @@ -2063,7 +2064,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb @Override public void contextAction(@NotNull SuspendContextImpl context) { showStatusText(JavaDebuggerBundle.message("status.run.to.cursor")); - cancelRunToCursorBreakpoint(); + cancelSteppingBreakpoints(); if (myRunToCursorBreakpoint == null) { return; } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java index 01994c412b22..5a30c88e93f3 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/SuspendManagerImpl.java @@ -319,7 +319,7 @@ public class SuspendManagerImpl implements SuspendManager { } else { LOG.debug("vote paused"); - myDebugProcess.cancelRunToCursorBreakpoint(); + myDebugProcess.cancelSteppingBreakpoints(); if (!Registry.is("debugger.keep.step.requests")) { ThreadReferenceProxyImpl thread = suspendContext.getEventThread(); myDebugProcess.deleteStepRequests(suspendContext.getVirtualMachineProxy().eventRequestManager(),