Recently [JDK-8305511](https://bugs.openjdk.org/browse/JDK-8305511) removed the "@ignore 6951287 ", allowing this test to run, which is why this failure mode is now turning up.
There is a race condition, leading to the `popFrames()` call being done while a native method is in the set of frames to be popped. This results in a `NativeMethodException` instead of the frames being popped. The debuggee has: public static void waiter() { if (waiting) { return; } waiting = true; System.out.println(" debuggee: in waiter"); while (true) { } } And the debugger waits for `waiting == true` (checked via JDI calls) before suspending and doing the `popFrames()`. The problem is the println() after setting `waiting = true`. The debugger side can detect that `waiting == true` before the println() is complete, and the println() involves native code. Once `waiting` is set true, we need to make sure no other method calls are made so we can be sure that only the `waiter()` method is on the stack. Note there is a lot of interesting history to this CR, including [JDK-6417053](https://bugs.openjdk.org/browse/JDK-6417053), which actually reproduced this issue long ago (but got closed as CNR), although it failed with a different error message (even though it was the same issue), and the different error message was itself the result of another bug that was inadvertently fixed when virtual threads support was added to JDI. See the CR for details if you are interested. ------------- Commit messages: - Move println to before setting the waiting flag Changes: https://git.openjdk.org/jdk/pull/13657/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=13657&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8306705 Stats: 3 lines in 1 file changed: 2 ins; 1 del; 0 mod Patch: https://git.openjdk.org/jdk/pull/13657.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/13657/head:pull/13657 PR: https://git.openjdk.org/jdk/pull/13657