RFR (XS) 6988950: JDWP exit error JVMTI_ERROR_WRONG_PHASE(112)

Daniel D. Daugherty daniel.daugherty at oracle.com
Wed Oct 29 13:46:37 UTC 2014


Serguei,

Do you have a scenario for the non-anonymous class case? This bug
(6988950) has been around much longer than anonymous classes...

Dan


On 10/28/14 7:11 PM, serguei.spitsyn at oracle.com wrote:
> Please, review the fix for:
>   https://bugs.openjdk.java.net/browse/JDK-6988950
>
>
> Open webrev:
> http://cr.openjdk.java.net/~sspitsyn/webrevs/2014/jdk/6988950-JDWP-wrong-phase.1/ 
>
>
>
> Summary:
>
>    The failing scenario:
>      The debugger and the debuggee are well aware a VM shutdown has 
> been started in the target process.
>      The debugger at this point is not expected to send any commands 
> to the JDWP agent.
>      However, the JDI layer (debugger side) and the jdwp agent 
> (debuggee side)
>      are not in sync with the consumer layers.
>
>      One reason is because the test debugger does not invoke the JDI 
> method VirtualMachine.dispose().
>      Another reason is that the Debugger and the debuggee processes 
> are uneasy to sync in general.
>
>      As a result the following steps are possible:
>        - The test debugger sends a 'quit' command to the test debuggee
>        - The debuggee is normally exiting
>        - The jdwp backend reports (over the jdwp protocol) an 
> anonymous class unload event
>        - The JDI InternalEventHandler thread handles the 
> ClassUnloadEvent event
>        - The InternalEventHandler wants to uncache the matching 
> reference type.
>          If there is more than one class with the same host class 
> signature, it can't distinguish them,
>          and so, deletes all references and re-retrieves them again 
> (see tracing below):
>            MY_TRACE: JDI: 
> VirtualMachineImpl.retrieveClassesBySignature: 
> sig=Ljava/lang/invoke/LambdaForm$DMH;
>        - The jdwp backend debugLoop_run() gets the command from JDI 
> and calls the functions
>          classesForSignature() and classStatus() recursively.
>        - The classStatus() makes a call to the JVMTI GetClassStatus() 
> and gets the JVMTI_ERROR_WRONG_PHASE
>        - As a result the jdwp backend reports the JVMTI error to the 
> JDI, and so, the test fails
>
>      For details, see the analysis in bug report closed as a dup of 
> the bug 6988950:
>         https://bugs.openjdk.java.net/browse/JDK-8024865
>
>      Some similar cases can be found in the two bug reports (6988950 
> and 8024865) describing this issue.
>
>      The fix is to skip reporting the JVMTI_ERROR_WRONG_PHASE error as 
> it is normal at the VM shutdown.
>      The original jdwp backend implementation had a similar approach 
> for the raw monitor functions.
>      Threy use the ignore_vm_death() to workaround the 
> JVMTI_ERROR_WRONG_PHASE errors.
>      For reference, please, see the file: src/share/back/util.c
>
>
> Testing:
>   Run nsk.jdi.testlist, nsk.jdwp.testlist and JTREG com/sun/jdi tests
>
>
> Thanks,
> Serguei
>



More information about the serviceability-dev mailing list