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.geo...@oracle.com <mailto:jini.geo...@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.griffi...@gmail.com <mailto:david.griffi...@gmail.com>
     > <mailto:david.griffi...@gmail.com
    <mailto:david.griffi...@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 <jcbey...@google.com
    <mailto:jcbey...@google.com>
     >     <mailto:jcbey...@google.com <mailto:jcbey...@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.griffi...@gmail.com
    <mailto:david.griffi...@gmail.com> <mailto:david.griffi...@gmail.com
    <mailto:david.griffi...@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
     >

Reply via email to