[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-serviceability-dev
Subject:    Re: RFR (XS) 6988950: JDWP exit error JVMTI_ERROR_WRONG_PHASE(112)
From:       "serguei.spitsyn () oracle ! com" <serguei ! spitsyn () oracle ! com>
Date:       2014-10-29 14:54:16
Message-ID: 5450FF98.7000902 () oracle ! com
[Download RAW message or body]

Thanks, Dmitry!
I'm still in a process of checking the consequences of the 
ignore_wrong_phase() calls.

Thanks,
Serguei

On 10/29/14 7:50 AM, Dmitry Samersoff wrote:
> Serguei,
>
> Thank you!
>
> Fix looks good for me.
>
> -Dmitry
>
> On 2014-10-29 17:35, serguei.spitsyn@oracle.com wrote:
>> Dmitry,
>>
>> Yes, it will return NULL if the case of JVMTI_ERROR_WRONG_PHASE error.
>> It is Ok for the getMethodClass() as the NULL return value listed in the
>> comment.
>> It seems to be Ok for other two uses of the methodClass().
>>
>> Thanks!
>> Serguei
>>
>> On 10/29/14 6:59 AM, Dmitry Samersoff wrote:
>>> Serguei,
>>>
>>> What happens in a caller function if we ignore the error?
>>>
>>> e. g. getMethodClass has the code:
>>> ...
>>>
>>>       error = methodClass(method, &clazz);
>>>       if ( error != JVMTI_ERROR_NONE ) {
>>>           EXIT_ERROR(error,"Can't get jclass for a methodID, invalid?");
>>>           return NULL;
>>>       }
>>>       return clazz;
>>>
>>> after the fix it probably will return NULL. Is it correct?
>>>
>>> -Dmitry
>>>
>>> On 2014-10-29 04:11, serguei.spitsyn@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
>>>>
>

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic