eclipse-platform / eclipse-platform/eclipse.platform

ResourceException Marker id not found when calling BreakpointManager.removeBreakpoints()

Open
#2,217 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Java
Stars
165
Forks
174
Avg merge
2d 8h
Merged PRs (30d)
22

Description

See: https://bugs.eclipse.org/bugs/show_bug.cgi?id=564872

During one of our tests we observed the following exception:

```
org.eclipse.core.internal.resources.ResourceException: Marker id 1332 not found.
at org.eclipse.core.internal.resources.Marker.checkInfo(Marker.java:63)
at org.eclipse.core.internal.resources.Marker.setAttribute(Marker.java:260)
at org.eclipse.jdt.internal.debug.ui.JavaDebugOptionsManager$2.run(JavaDebugOptionsManager.java:894)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2317)
at org.eclipse.jdt.internal.debug.ui.JavaDebugOptionsManager.updateBreakpointMessages(JavaDebugOptionsManager.java:906)
at org.eclipse.jdt.internal.debug.ui.JavaDebugOptionsManager.breakpointsChanged(JavaDebugOptionsManager.java:965)
at org.eclipse.debug.internal.core.BreakpointManager$BreakpointsNotifier.run(BreakpointManager.java:1104)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
at org.eclipse.debug.internal.core.BreakpointManager$BreakpointsNotifier.notify(BreakpointManager.java:1124)
at org.eclipse.debug.internal.core.BreakpointManager.fireUpdate(BreakpointManager.java:975)
at org.eclipse.debug.internal.core.BreakpointManager.access$4(BreakpointManager.java:962)
at org.eclipse.debug.internal.core.BreakpointManager$BreakpointManagerVisitor.update(BreakpointManager.java:788)
at org.eclipse.debug.internal.core.BreakpointManager.resourceChanged(BreakpointManager.java:699)
at org.eclipse.core.internal.events.NotificationManager$1.run(NotificationManager.java:305)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
at org.eclipse.core.internal.events.NotificationManager.notify(NotificationManager.java:295)
at org.eclipse.core.internal.events.NotificationManager.broadcastChanges(NotificationManager.java:158)
at org.eclipse.core.internal.resources.Workspace.broadcastBuildEvent(Workspace.java:366)
at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:157)
at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:244)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
!SUBENTRY 1 org.eclipse.core.resources 4 376 2020-06-30 21:21:07.013
```

Upon investigation, the exception coincides with a call to `org.eclipse.debug.internal.core.BreakpointManager.removeBreakpoints(IBreakpoint[], boolean)` from our test. The code in `BreakpointManager.removeBreakpoints()` deletes a breakpoint marker without specifying a rule, and so can cause race condition (and e.g. cause the error stack trace above).

As in [bug 540132](https://bugs.eclipse.org/bugs/show_bug.cgi?id=540132) (https://git.eclipse.org/c/jdt/eclipse.jdt.debug.git/commit/?id=897972b60a60c5bd9d0b8138d5be9b07addfcaf5), the breakpoints operation should specify a workspace modification rule if there is no matching outer rule.

To reproduce:

1. Debug Eclipse.
2. In the debuggee Eclipse, set a breakpoint at the `System.out.println()` in this snippet:
```
package test;

public class TestClass {

public static void main1(String[] args) {
System.out.println("hello world");
}

}
```
3. Set a breakpoint at `org.eclipse.jdt.internal.debug.ui.JavaDebugOptionsManager.updateBreakpointMessages(IBreakpoint[])`, at:
```
marker.setAttribute(IMarker.MESSAGE, type + info);
```
4. Set a breakpoint at the start of: `org.eclipse.debug.internal.core.BreakpointManager.removeBreakpoints(IBreakpoint[], boolean)`
5. Change the `main` method name to `main1` (simply by typing, no need for refactor rename) and save. This hits the breakpoint at `JavaDebugOptionsManager.updateBreakpointMessages`.
6. Remove all breakpoints with the respective Breakpoints view action, this hits the breakpoint at `BreakpointManager.removeBreakpoint()`.
7. Resume first the thread in `BreakpointManager` (twice), then the thread in `JavaDebugOptionsManager`.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.