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>
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> 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> 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