RFR: 8274687: JDWP deadlocks if some Java thread reaches wait in blockOnDebuggerSuspend

Richard Reingruber rrich at openjdk.java.net
Thu Oct 7 14:20:26 UTC 2021


This change fixes deadlocks described in the JBS-bug by:

* Releasing `handlerLock` before waiting on `threadLock` in `blockOnDebuggerSuspend()`

* Notifying on `threadLock` in `threadControl_reset()`

Also the actions in handleAppResumeBreakpoint() are moved/deferred until
doPendingTasks() runs. This is necessary because an event handler must not
release handlerLock first and foremost because handlers are called while
iterating the handler chain for an event type which is protected by handlerLock
(see https://github.com/openjdk/jdk/pull/5805)

The first commit delays the cleanup actions after leaving the loop in
`debugLoop_run()`. It allows to reproduce the deadlock running the dispose003
test with the command


make run-test TEST=test/hotspot/jtreg/vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose003


The second commit adds a new test that reproduces the deadlock when calling
threadControl_resumeThread() while a thread is waiting in
blockOnDebuggerSuspend().

The third commit contains the fix described above. With it the deadlocks
cannot be reproduced anymore.

The forth commit removes the diagnostic code introduced with the first commit again.

The fix passed

test/hotspot/jtreg/serviceability/jdwp
test/jdk/com/sun/jdi
test/hotspot/jtreg/vmTestbase/nsk/jdwp
test/hotspot/jtreg/vmTestbase/nsk/jdi

-------------

Commit messages:
 - Remove delay in cleanup again.
 - Fix that prevents deadlocks.
 - New test that deadlocks target VM calling ThreadReference.resume().
 - Delay cleanup after JDWP Dispose command to trigger deadlock in the test dispose003

Changes: https://git.openjdk.java.net/jdk/pull/5849/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=5849&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8274687
  Stats: 280 lines in 2 files changed: 262 ins; 13 del; 5 mod
  Patch: https://git.openjdk.java.net/jdk/pull/5849.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/5849/head:pull/5849

PR: https://git.openjdk.java.net/jdk/pull/5849


More information about the serviceability-dev mailing list