RFR 8163127: Debugger classExclusionFilter does not work correctly with method references
Daniil Titov
daniil.x.titov at oracle.com
Thu Jan 24 21:38:35 UTC 2019
Hi Serguei,
The testing is not fully completed yet. I ran locally jdk_jdi, vmTestbase_nsk_jdi, vmTestbase_nsk_jdb and have the same tests plus serviceability still running in Mach5. I am also starting tier1,tier2 and tier3 jobs.
Best regards,
Daniil
On 1/24/19, 12:22 PM, "serguei.spitsyn at oracle.com" <serguei.spitsyn at oracle.com> wrote:
Hi Daniil,
I wonder what tests do you run to make sure nothing is broken.
Thanks,
Serguei
On 1/24/19 11:19, Chris Plummer wrote:
> Hi Daniil,
>
> Thanks for the stack track. I was just about to send an email asking
> for it when your new RFR arrived.
>
> The fix looks good. I think you also need to apply it here:
>
> InterpreterRuntime::ldc()
> InterpreterRuntime::anewarray()
> InterpreterRuntime::multianewarray()
> InterpreterRuntime::quicken_io_cc()
>
> I wonder if it wouldn't be better if you moved the disabling into
> ConstantPool::klass_at_impl()
>
> thanks,
>
> Chris
>
> On 1/24/19 10:38 AM, Daniil Titov wrote:
>> Hi Chris and JC,
>>
>> Thank you for reviewing this change. Please review a new version of
>> the fix that uses
>> the approach Chris suggested ( disabling the single stepping during
>> the class resolution).
>>
>> Just in case please find below the stack trace for this case when
>> loadClass() method is entered.
>>
>> #0 SystemDictionary::load_instance_class(Symbol*, Handle,
>> Thread*) at open/src/hotspot/share/classfile/systemDictionary.cpp:1502
>> #1 SystemDictionary::resolve_instance_class_or_null(Symbol*,
>> Handle, Handle, Thread*) at
>> open/src/hotspot/share/classfile/systemDictionary.cpp:853
>> #2 SystemDictionary::resolve_instance_class_or_null_helper(Symbol*,
>> Handle, Handle, Thread*) at
>> open/src/hotspot/share/classfile/systemDictionary.cpp:271
>> #3 SystemDictionary::resolve_or_null(Symbol*, Handle, Handle,
>> Thread*) at open/src/hotspot/share/classfile/systemDictionary.cpp:254
>> #4 SystemDictionary::resolve_or_fail(Symbol*, Handle, Handle,
>> bool, Thread*) at
>> open/src/hotspot/share/classfile/systemDictionary.cpp:202
>> #5 ConstantPool::klass_at_impl(constantPoolHandle const&, int,
>> bool, Thread*) at open/src/hotspot/share/oops/constantPool.cpp:483
>> #6 ConstantPool::klass_at(int, Thread*) at
>> open/src/hotspot/share/oops/constantPool.hpp:382
>> #7 InterpreterRuntime::_new(JavaThread*, ConstantPool*, int) at
>> open/src/hotspot/share/interpreter/interpreterRuntime.cpp:234
>> # 8 <Stub Code>
>> ....
>>
>> Webrev: http://cr.openjdk.java.net/~dtitov/8163127/webrev.02/
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8163127
>>
>> Thanks,
>> Daniil
>>
>> On 1/23/19, 3:53 PM, "Chris Plummer" <chris.plummer at oracle.com> wrote:
>>
>> Hi Daniil,
>> I don't see an explanation for why fromDepth is 1 and
>> afterPopDepth is 4.
>> currentDepth = getThreadFrameCount(thread);
>> fromDepth = step->fromStackDepth;
>> afterPopDepth = currentDepth-1;
>> step->fromStackDepth got setup when single stepping was
>> first setup for
>> this thread. There was also a notifyFramePop() done at this
>> time, but I
>> think that's just to catch exiting from the method you were single
>> stepping in, and has no bearing in the case we are looking at here,
>> where we area still some # of frames below where we user last
>> issued a
>> STEP_INTO. The FRAME_POP we are receiving now is not the one for
>> when
>> step->fromStackDepth was setup, but is for when we stepped into a
>> filtered method. I think this is what the "fromDepth >
>> afterPopDepth"
>> check is for. I think the current logic is correct for intended
>> handling
>> of a FRAME_POP event. Although your fix is probably solving the
>> problem,
>> I get the feeling it is enabling single stepping too soon in
>> many cases.
>> That many not turn up as an error in any tests, but could cause
>> debugging performance issues, or for the user to see spurious
>> single
>> step events that they were not expecting.
>> I think the bug actually occurs long before we ever get to
>> this point in
>> the code (and we should in fact not be getting here). In my last
>> entry
>> in the bug I mentioned JvmtiHideSingleStepping(), and how it is
>> used to
>> turn off single stepping while we are doing invoke and field
>> resolution,
>> but doesn't seem to be used during class resolution, which is
>> what we
>> are doing here. If it where used, then the agent would never
>> even see
>> the SINGLE_STEP when loadClass() is entered, therefore no
>> notifyFramePop() would be done, and we would not be relying on
>> this code
>> in handleFramePopEvent(). Instead, we would receive the next
>> SINGLE_STEP
>> event after cp resolution is complete, and we are finally
>> executing the
>> now resolved opc_new opcode.
>> I'm hoping Serguei and/or Alex can also comment on this,
>> since I think
>> they were dealing with JvmtiHideSingleStepping() last month.
>> thanks,
>> Chris
>> On 1/17/19 6:08 PM, Daniil Titov wrote:
>> > Please review the change that fixes JDB stepping issue for a
>> specific case when the single step request was initiated earlier in
>> the stack, previous calls were for methods in the filtered classes
>> (single stepping was disabled), handleMethodEnterEvent() re-enabled
>> stepping and the first bytecode upon entering the current method
>> requires resolving constant pool entry. In this case the execution
>> resumes in java.lang.Classloader.loadClass() and since it is also a
>> filtered class the single stepping is getting disabled again
>> (stepControl.c :593). When loadClass() exits a notifyFramePop() is
>> called on the loadClass() frame but due to condition fromDepth >=
>> afterPopDepth at stepControl.c :346 (that doesn't hold in this case,
>> in this case fromDepth is 1 and afterPopDepth is 4) the
>> notifyFramePop() fails to enable single stepping back. The fix
>> removes the excessive condition fromDepth >= afterPopDepth in
>> notifyFramePop() method (stepControl.c:346) to ensure that when a
>> method cal!
>> > led from the stepping frame (and during which we had
>> stepping disabled) has returned the stepping is re-enabled to
>> continue instructions steps in the original stepping frame.
>> >
>> > Webrev: http://cr.openjdk.java.net/~dtitov/8163127/webrev.01
>> > Bug: https://bugs.openjdk.java.net/browse/JDK-8163127
>> >
>> > Thanks!
>> > --Daniil
>> >
>> >
>>
>>
>
>
More information about the serviceability-dev
mailing list