RFR(S) 8177901: JDWP exit error JVMTI_ERROR_WRONG_PHASE(112): on checking for an interface

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Tue Sep 5 05:23:55 UTC 2017


Hi David,


On 9/4/17 21:43, David Holmes wrote:
> Hi Serguei,
>
> This looks good to me. One not below.
>
> On 2/09/2017 6:30 PM, serguei.spitsyn at oracle.com wrote:
>> Please, review a fix for:
>> https://bugs.openjdk.java.net/browse/JDK-8177901
>>
>> Webrev:
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2017/hotspot/8177901-jdi-wrong_phase.1 
>>
>
> src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c
>
> +     // Release commandLoop vmDeathLock if necessary
> +     void commandLoop_exitVmDeathLockOnError(void);
> +     commandLoop_exitVmDeathLockOnError();
>
> The declaration should be in the eventHelper.h header file. It looks 
> really odd to declare the function then call it.

Ok, I'll move it to the header.

Thank you a lot for he review!
Serguei

>
> Thanks,
> David
> -----
>
>>
>> Summary:
>>
>>    The approach to fix this is to introduce a new lock vmDeathLock in 
>> eventHelper.c
>>    and use it to sync the commandLoop with the JVMTI event callback 
>> cbVMDeath
>>    the same way as it was done for debugLoop_run.
>>    (see the fix of: https://bugs.openjdk.java.net/browse/JDK-8134103)
>>
>>    One potential issue with it is that the commandLoop() transitively 
>> uses some helper
>>    functions (e.g. from util.c) that use the macro EXIT_ERROR, and 
>> so, can abort.
>>    It seems, in such a case the vmDeathLock will remain locked, and so,
>>    the cbVMDeath() will block on it causing a deadlock.
>>    Note, that these helper functions can be also called from 
>> different contexts/threads
>>    (not from the commandLoop thread only). In such contexts the 
>> commandLoop vmDeathLock
>>    is not being entered, and so, should not be exited.
>>
>>    To fix this potential issue, new function, 
>> commandLoop_exitVmDeathLockOnError(),
>>    is introduced, and it is called from the debugInit_exit().
>> The commandLoop_exitVmDeathLockOnError() always checks if current 
>> thread is
>>    the commandLoop thread and only in such a case unlocks the 
>> vmDeathLock.
>>
>> Testing:
>>    Ran the nsk.jdi, nsk.jdwp and jtreg jdk_jdi for both release and 
>> fastdebug builds.
>>    All tests are passed.
>>
>> Thanks,
>> Serguei
>>



More information about the serviceability-dev mailing list