RFR(S): 8166679: JNI AsyncGetCallTrace replaces topmost frame name with <no Java callstack recorded> starting with Java 9 b133
Daniel D. Daugherty
daniel.daugherty at oracle.com
Fri Oct 21 14:59:47 UTC 2016
On 10/20/16 2:28 PM, Chris Plummer wrote:
> Hello,
>
> Please review the following:
>
> http://cr.openjdk.java.net/~cjplummer/8166679/webrev.00/webrev.hotspot/
src/cpu/aarch64/vm/frame_aarch64.cpp
So we're in a "if (StubRoutines::returns_to_call_stub()" block
and the assumption was that a frame that returns to a call stub
must be an entry frame. Hence the use of is_entry_frame_valid().
However, your investigation revealed that you can be in an
interpreter frame that returns to a call stub here. That sounds
both familiar and right :-)
L209: bool jcw_safe = (jcw < thread->stack_base()) && ( jcw >
(address)sender.fp());
nit: please remove extra blank here: "( jcw"
I like the new JavaCallWrapper sanity check. I never thought of
that when I worked on AsyncGetCallTrace().
src/cpu/sparc/vm/frame_sparc.cpp
old L281: if (sender.is_entry_frame()) {
old L282: return sender.is_entry_frame_valid(thread);
old L283: }
I don't understand this one. Why isn't is_entry_frame_valid()
correct here? You are in a "if (sender.is_entry_frame())" block.
I can see wanting to add the JavaCallWrapper sanity check as
an additional check. If you do that:
L286 bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw >
sender_fp);
nit: please remove extra blank here: "( jcw"
src/cpu/x86/vm/frame_x86.cpp
Again we're in a if (StubRoutines::returns_to_call_stub()" block
so I see why is_entry_frame_valid() is not the right call.
L208: bool jcw_safe = (jcw < thread->stack_base()) && ( jcw >
(address)sender.fp());
nit: please remove extra blank here: "( jcw"
OK so I understand the AARCH64 and X86 changes. I don't quite
understand the SPARC change... but I can be convinced otherwise.
If you fix the nits, I don't need to see a new webrev.
Dan
> https://bugs.openjdk.java.net/browse/JDK-8166679
>
> The fix is to partially undo the changes for JDK-8159284. There are
> two places where the fix for JDK-8159284 added an extra check of the
> validity of the entry frame, but really only the first one is
> appropriate since for the second one we are not in an entry frame.
> More details can be found near the end of the bug comments.
>
> Note I did a straight patch of the old version of the code. It could
> probably use some formatting and comment cleanup. I decided not to
> clean it up to make it easy to compare the current code with the
> original. I'll clean it up if you feel it would be best to.
>
> Tested by running KitchenSink more times than I can count, since
> that's where JDK-8159284 turned up. However, that's not proving much
> since I could not reproduce JDK-8159284 even without its fix in place
> (it also couldn't be reproduced at the time JDK-8159284 was was being
> investigated and fixed). For this reason I can't be 100% sure that
> JDK-8159284 is not being re-introduced with my changes.
>
> Also tested by running a very large set of tests trough RBT, close to
> what we do for PIT testing, minus product builds and a few tests that
> take a long time to run.
>
> Lastly, I also tested with the test case in the CR to make sure it now
> passes. Unforgettably it's not possible to add the test case as a
> jtreg test since it requires the installation of the Oracle Studio tools.
>
> thanks,
>
> Chris
More information about the hotspot-runtime-dev
mailing list