Suggested improvement to X86Frame.getInterpreterFrameBCI
Jini George
jini.george at oracle.com
Thu Nov 22 09:02:20 UTC 2018
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>> 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>> 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>>
> 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
>
More information about the serviceability-dev
mailing list