The root cause of
During VM_DEATH handling, the debugger was also doing a VM.resume(), which calls commonResumeList(), which first walks runningThreads to build a list of threads that need to be resumed. After resuming these threads, it then walks this list of resumed threads, calling findThread() on each so it can do some bookkeeping on the ThreadNode. This is when sometimes we run into a thread that is on the list but no longer has a TLS. It basically has exited without the debug agent seeing a THREAD_END.
The fix is when handling VM_DEATH, don't have findThread() do the assert that checks if a thread has no TLS but is on runningThreads. Instead, if the thread has no TLS, then also look it up on runningThreads. Note normally we want to avoid this lookup (this is part of what
- relates to
JDK-8265683 vmTestbase/nsk/jdb tests failed with "JDWP exit error AGENT_ERROR_INTERNAL(181)"
JDK-8265028 JDWP debug agent thread lookup can be made faster