Suggested improvement to X86Frame.getInterpreterFrameBCI
David Griffiths
david.griffiths at gmail.com
Wed Dec 5 11:09:54 UTC 2018
Hi, thanks for reviewing. I have made the changes you suggested and also
tidied up the constructors a bit (there was already a 4x Address
constructor), hope that's ok.
Cheers,
David
On Fri, 30 Nov 2018 at 17:06, JC Beyler <jcbeyler at google.com> wrote:
> Hi both,
>
> The webrev looks good to me but I could see gains of just adding a new
> constructor instead of doing a new + set.
>
> LinuxAMD64JavaThreadPDAccess.java would become consistent with the rest of
> the code:
> + } else if (VM.getVM().getInterpreter().contains(guesser.getPC())) {
> + // pass the value of R13 which contains the bcp for the top level
> frame
> + return new X86Frame(guesser.getSP(), guesser.getFP(),
> guesser.getPC(),
> + context.getRegisterAsAddress(AMD64ThreadContext.R13));
> } else {
>
> - And for X86Frame.java, that means there is no set method (there isn't a
> single one yet there so we are consistent there).
> - Finally, instead of just r13 internally to the Frame, we could just call
> it the bcp since that is what you are saying it is and then adapt the
> getInterpreterFrameBCI a bit because a bcp local variable is there :-)
>
> But these are nits :),
> Jc
>
> On Fri, Nov 30, 2018 at 6:21 AM Jini George <jini.george at oracle.com>
> wrote:
>
>> Your patch looks good to me, David. I can sponsor this for you if we get
>> one more review.
>>
>> Thanks,
>> Jini.
>>
>> On 11/22/2018 5:42 PM, David Griffiths wrote:
>> > Thanks Jini, please find patch for Java 9 attached (I don't have author
>> > access to the bug itself).
>> >
>> > Cheers,
>> >
>> > David
>> >
>> > On Thu, 22 Nov 2018 at 09:02, Jini George <jini.george at oracle.com
>> > <mailto:jini.george at oracle.com>> wrote:
>> >
>> > Thank you very much for working on the fix for this issue, David. It
>> > would be great if you can send in a complete patch for the review
>> (With
>> > a first cut look, there seems to be missing pieces).
>> >
>> > I have created a bug for this:
>> >
>> > https://bugs.openjdk.java.net/browse/JDK-8214226
>> >
>> > Thank you,
>> > Jini
>> >
>> > On 11/22/2018 12:50 AM, David Griffiths wrote:
>> > > PS: should have added a new X86Frame constructor really, may have
>> > just
>> > > been put off because there is already a four address constructor
>> so
>> > > would have had to add dummy argument or something.
>> > >
>> > > On Wed, 21 Nov 2018 at 19:15, David Griffiths
>> > <david.griffiths at gmail.com <mailto:david.griffiths at gmail.com>
>> > > <mailto:david.griffiths at gmail.com
>> > <mailto:david.griffiths at gmail.com>>> wrote:
>> > >
>> > > Hi, thanks, apart from adding a setter for R13 in X86Frame,
>> the
>> > > other half of the fix is this:
>> > >
>> > > public Frame getCurrentFrameGuess(JavaThread thread,
>> > Address
>> > > addr) {
>> > > ThreadProxy t = getThreadProxy(addr);
>> > > AMD64ThreadContext context = (AMD64ThreadContext)
>> > t.getContext();
>> > > AMD64CurrentFrameGuess guesser = new
>> > > AMD64CurrentFrameGuess(context, thread);
>> > > if (!guesser.run(GUESS_SCAN_RANGE)) {
>> > > return null;
>> > > }
>> > > if (guesser.getPC() == null) {
>> > > return new X86Frame(guesser.getSP(), guesser.getFP());
>> > > } else if
>> > (VM.getVM().getInterpreter().contains(guesser.getPC())) {
>> > > // pass the value of R13 which contains the bcp for
>> > the top
>> > > level frame
>> > > Address r13 =
>> > > context.getRegisterAsAddress(AMD64ThreadContext.R13);
>> > > X86Frame frame = new X86Frame(guesser.getSP(),
>> > > guesser.getFP(), guesser.getPC());
>> > > frame.setR13(r13);
>> > > return frame;
>> > > } else {
>> > > return new X86Frame(guesser.getSP(), guesser.getFP(),
>> > > guesser.getPC());
>> > > }
>> > > }
>> > >
>> > > (the whole "if pc in interpreter" block is new)
>> > >
>> > > Overhead likely to be low as this is only used in diagnostic
>> > code.
>> > > Can't think of any risk but I'm not an expert on this code.
>> > >
>> > > Cheers,
>> > >
>> > > David
>> > >
>> > > On Wed, 21 Nov 2018 at 19:01, JC Beyler <jcbeyler at google.com
>> > <mailto:jcbeyler at google.com>
>> > > <mailto:jcbeyler at google.com <mailto:jcbeyler at google.com>>>
>> wrote:
>> > >
>> > > Hi David,
>> > >
>> > > I think the easiest would be to see whole change to
>> > understand
>> > > the repercussions of the change. I would imagine that any
>> > change
>> > > that helps stacktraces being more precise is a good
>> thing but
>> > > there are questions that arise every time:
>> > > - What is the overhead of adding this?
>> > > - Does this add any risk of failure?
>> > >
>> > > I'd imagine that the change is relatively small and
>> should be
>> > > easy to assess this but seeing it would make things
>> easier to
>> > > determine.
>> > >
>> > > That being said, I'm not a reviewer for OpenJDK so this
>> is
>> > > really just my 2cents,
>> > > Jc
>> > >
>> > > On Wed, Nov 21, 2018 at 9:17 AM David Griffiths
>> > > <david.griffiths at gmail.com
>> > <mailto:david.griffiths at gmail.com> <mailto:
>> david.griffiths at gmail.com
>> > <mailto:david.griffiths at gmail.com>>>
>> > > wrote:
>> > >
>> > > Hi, I'm new to this mailing list and working on a
>> project
>> > > that makes use of the SA classes to get stack traces
>> > from a
>> > > paused in flight JVM (we can't use JDWP). I have
>> observed
>> > > that if the top frame is in the interpreter it
>> > reports the
>> > > BCI and line number incorrectly. This is because
>> > > X86Frame.getInterpreterFrameBCI uses the value stored
>> > on the
>> > > stack rather than the actual live value stored in
>> R13.
>> > >
>> > > I have a patch for this which lets
>> > > LinuxAMD64JavaThreadPDAccess.getCurrentFrameGuess
>> > pass the
>> > > R13 value to X86Frame so that the latter can then do:
>> > >
>> > > public int getInterpreterFrameBCI() {
>> > > Address bcp =
>> > > addressOfInterpreterFrameBCX().getAddressAt(0);
>> > > // If we are in the top level frame then R13 may
>> > have
>> > > been set for us which contains
>> > > // the BCP. If so then let it take priority. If
>> > we are
>> > > in a top level interpreter frame,
>> > > // the BCP is live in R13 (on x86) and not saved
>> > in the
>> > > BCX stack slot.
>> > > if (r13 != null) {
>> > > bcp = r13;
>> > > }
>> > > Address methodHandle =
>> > > addressOfInterpreterFrameMethod().getAddressAt(0);
>> > >
>> > > and this fixes the problem.
>> > >
>> > > Does this sound like a good idea and if so should I
>> > submit a
>> > > patch?
>> > >
>> > > Cheers,
>> > >
>> > > David
>> > >
>> > >
>> > >
>> > > --
>> > >
>> > > Thanks,
>> > > Jc
>> > >
>> >
>>
>
>
> --
>
> Thanks,
> Jc
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20181205/c64d885b/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: revised_interpreter_frame.patch
Type: application/octet-stream
Size: 4644 bytes
Desc: not available
URL: <http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20181205/c64d885b/revised_interpreter_frame-0001.patch>
More information about the serviceability-dev
mailing list