RFR(S): 8134103: JVMTI_ERROR_WRONG_PHASE(112): on checking for an interface

Daniel D. Daugherty daniel.daugherty at oracle.com
Thu Mar 2 22:06:49 UTC 2017


On 3/2/17 2:24 PM, serguei.spitsyn at oracle.com wrote:
> The updated webrev:
> http://cr.openjdk.java.net/~sspitsyn/webrevs/2017/hotspot/8134103-jdi-wrong-phase.2/ 
>
>
> The change at L152-L153 has been reverted.
> Just one sanity check is needed.

This comment from earlier review is still unresolved:

src/jdk.jdwp.agent/share/native/libjdwp/eventHelper.c
     L243:          * Immediately close out any commands enqueued from a
     L244:          * previously attached debugger.

         Perhaps L244 can be change to:

                    * dead VM or a previously attached debugger.

         to match the changed line of code:

             L246         if (gdata->vmDead || command->sessionID != 
currentSessionID) {

Sorry I didn't notice that you didn't reply to it earlier...

I presume you are retesting... How often does
hotspot/test/closed/compiler/c1/6507107/HeapwalkingTest.java reproduce
the problem?

Dan

>
> Thanks,
> Serguei
>
>
> On 3/2/17 11:21, serguei.spitsyn at oracle.com wrote:
>> Dan,
>>
>> Thank you for reviewing!
>> I was waiting for your comments.
>>
>>
>> On 3/2/17 06:59, Daniel D. Daugherty wrote:
>>> On 3/1/17 8:49 PM, serguei.spitsyn at oracle.com wrote:
>>>> Please, review the JDK 10 fix for:
>>>>   https://bugs.openjdk.java.net/browse/JDK-8134103
>>>>
>>>>
>>>> Webrev:
>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2017/hotspot/8134103-jdi-wrong-phase.1/ 
>>>>
>>>
>>> src/jdk.jdwp.agent/share/native/libjdwp/debugLoop.c
>>>     old L152:             } else if (gdata->vmDead &&
>>>     old L153:              ((cmd->cmdSet) != 
>>> JDWP_COMMAND_SET(VirtualMachine))) {
>>>
>>>         The old code used to set the error condition when the VM
>>>         is dead and the command was not in the VirtualMachine
>>>         command set. With the new code:
>>>
>>>             L150:             } else if (gdata->vmDead) {
>>>
>>>         The error condition is now set for all command sets
>>>         including the VirtualMachine command set. Minimally
>>>         that means that this comment needs work:
>>>
>>>             L152:                  * VirtualMachine cmdSet quietly 
>>> ignores some cmds
>>>             L153:                  * after VM death, so, it sends 
>>> it's own errors.
>>>
>>>         since you are no longer letting the VirtualMachine cmdSet send
>>>         its own errors.
>>
>> Agreed, good catch, thanks!
>>
>>
>>>
>>>         It's not clear to me why you are now setting the error
>>>         condition for VirtualMachine cmds instead of letting those
>>>         cmds send their own errors.
>>>
>>>         See more comments below for your summary.
>>
>> Most likely, you are right here.
>> I specifically looked at the VM commands but overlooked the ones that 
>> are silently ignored.
>> For instance: Resume (9) or exit (10).
>>
>> So, I will need to restore the L152+L153.
>> Please, let me re-test this update and then I'll send another webrev.
>> Interesting that no test has caught this as there is a very tiny gap 
>> for such an intermittent issue to appear.
>>
>>
>>>
>>> src/jdk.jdwp.agent/share/native/libjdwp/eventHelper.c
>>>     L243:          * Immediately close out any commands enqueued from a
>>>     L244:          * previously attached debugger.
>>>
>>>         Perhaps L244 can be change to:
>>>
>>>                    * dead VM or a previously attached debugger.
>>>
>>>         to match the changed line of code:
>>>
>>>             L246         if (gdata->vmDead || command->sessionID != 
>>> currentSessionID) {
>>>
>>>>
>>>>
>>>> Summary:
>>>>   This is an intermittent issue in the debugger back-end (JDWP agent)
>>>>   that impacts the nightly testing stability.
>>>
>>> Congrats on tracking down this elusive bug!
>>
>> Thanks!
>>
>>>
>>>
>>>>   The fix adds check guards of gdata->vmDead condition to the:
>>>>    - debugLoop (JDWP Event Helper thread) and
>>>>    - commandLoop (JDWP Transport Listener thread)
>>>>   The commands are ignored in the DEAD phase.
>>>
>>> In the debugLoop, you aren't ignoring the commands, you
>>> are setting an error condition.
>>
>> Right, I meant: ignored == not executed. :)
>>
>>
>>>
>>>
>>>>   The check guard in the debugLoop already existed but only for 
>>>> VirtualMachine
>>>>   command set, so it has been extended to commands from all JDWP 
>>>> command sets.
>>>
>>> I'm reading the existing code exactly opposite of what you
>>> say here. The gdata->vmDead check applied to all command
>>> sets except for the VirtualMachine command set. I agree
>>> that you've extended it to all command sets, but we're
>>> not ignoring the commands. We are now setting the error
>>> condition for all command sets.
>>
>> Agreed.
>>
>>
>>>
>>> Maybe I'm missing something here. Perhaps I've been away
>>> from this code for too long... :-)
>>
>> No, it is that I'm still learning this code with your help. :-)
>>
>>
>> Thanks a lot!
>> Serguei
>>
>>>
>>> Dan
>>>
>>>
>>>>
>>>>   I suspect, this bug could also cause some of the timeout and 
>>>> socket related issues.
>>>>
>>>>
>>>> Testing:
>>>>   The fix was tested with the nsk.jdi, jtreg com/sun/jdi and 100 runs
>>>>   of the hotspot/test/closed/compiler/c1/6507107/HeapwalkingTest.java.
>>>>   The test results are very clean.
>>>>
>>>>
>>>> Thanks,
>>>> Serguei
>>>
>>
>



More information about the serviceability-dev mailing list