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
Thu Sep 14 23:41:28 UTC 2017


On 9/14/17 16:40, Daniel D. Daugherty wrote:
> On 9/14/17 5:26 PM, serguei.spitsyn at oracle.com wrote:
>> Hi Dan,
>>
>> Thank you a lot for reviewing!
>> All your suggestions are accepted.
>>
>> The updated webrev:
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2017/hotspot/8177901-jdi-wrong_phase.2/ 
>>
>
> Re-reviewed all the files. Thumbs up!

Thanks, Dan!
Serguei


>
> Dan
>
>
>>
>>
>> Just a sanity check is needed.
>>
>> Thanks,
>> Serguei
>>
>>
>>
>> On 9/14/17 14:53, Daniel D. Daugherty wrote:
>>> On 9/4/17 11:23 PM, serguei.spitsyn at oracle.com wrote:
>>>> 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.
>>>
>>> I did look for a newer webrev and didn't find one.
>>>
>>>
>>> General comments:
>>>   - Please update the copyright years as needed before pushing.
>>>
>>> src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c
>>>     No comments (other than agreeing with David H).
>>>
>>> src/jdk.jdwp.agent/share/native/libjdwp/eventHandler.c
>>>     L1289:     /*
>>>     L1290:      * The VM will die soon after the completion of this 
>>> callback - we
>>>     L1291:      * may need to do a final synchronization with the 
>>> command loop to
>>>     L1292:      * avoid the VM terminating with replying to the 
>>> final (resume)
>>>     L1293:      * command.
>>>     L1294:      */
>>>     L1295:     commandLoop_sync();
>>>
>>>         Seems like your addition of the call to commandLoop_sync()
>>>         might resolve what appears (to me) to be a placeholder
>>>         comment for a future change. Perhaps the comment should be
>>>         something like this:
>>>
>>>         /*
>>>          * The VM will die soon after the completion of this callback -
>>>          * we synchronize with both the command loop and the debug loop
>>>          * for a more orderly shutdown.
>>>          */
>>>
>>> src/jdk.jdwp.agent/share/native/libjdwp/eventHelper.c
>>>     L772: void commandLoop_exitVmDeathLockOnError() {
>>>         The '{' should be on a line by itself to keep in the
>>>         same existing style.
>>>
>>>     L127: static jrawMonitorID vmDeathLock;
>>>     L708:             debugMonitorEnter(vmDeathLock);
>>>     L714:             debugMonitorExit(vmDeathLock);
>>>     L778:     err = JVMTI_FUNC_PTR(gdata->jvmti, GetCurrentThread)
>>>     L779:               (gdata->jvmti, &cur_thread);
>>>     L794:     debugMonitorExit(vmDeathLock);
>>>         L794 assumes that the vmDeathLock is held by the Command
>>>         Loop Thread. Perhaps add a new volatile flag after L127
>>>         that is set to true after L708 and set to false before
>>>         L714. Check the flag before calling GetCurrentThread()
>>>         on L778 and return early if the flag is not true.
>>>
>>> src/jdk.jdwp.agent/share/native/libjdwp/eventHelper.h
>>>     L57: void commandLoop_sync(void); /* commandLoop sync with 
>>> cbVMDeath */
>>>         Extra space before 'cbVMDeath'.
>>>
>>> Dan
>>>
>>>
>>>>
>>>> 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