[External] : Re: Where does VMError::print_native_stack and os::get_sender_for_C_frame load/use the frame pointer?

Julian Waters tanksherman27 at gmail.com
Thu Jul 11 08:57:23 UTC 2024


Seems like I found an old gem where the issue with the frame pointer was
first discovered

https://bugs.openjdk.org/browse/JDK-8022335
https://github.com/openjdk/jdk/commit/1c2a7eea85ea261102687190d6b2e92c560770b8

best regards,
Julian


On Thu, Jul 11, 2024 at 4:12 PM Julian Waters <tanksherman27 at gmail.com>
wrote:

> Hi Dean,
>
> Thanks for the quick reply. At the risk of testing your patience, I
> don't really follow, since that is how os::get_sender_for_C_frame is
> implemented on other platforms (I copied it from Linux x86 in this
> case). All I got from the comment is that the only reason we usually
> have to use the StackWalk API on Windows is because the frame pointer
> is not saved when using the Microsoft compiler, however in my case I'm
> not using the Microsoft compiler and have verified that the frame
> pointer is saved in my custom JVMs. I'm not sure how
> VMError::print_native_stack on other platforms manages to work when
> they also do
>
> return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
>
> in os::get_sender_for_C_frame like I did here
>
> Thanks for your time and patience!
>
> best regards,
> Julian
>
> On Thu, Jul 11, 2024 at 3:17 PM <dean.long at oracle.com> wrote:
> >
> > Using fr->link() in get_sender_for_C_frame() gives the wrong answer
> because it refers to the current frame, not the sender frame. There is no
> frame::sender_fp() because the information we need could be anywhere in the
> frame or even nowhere in the frame. This is what the comment about
> StackWalk() API is hinting at. Even debuggers can have trouble giving an
> accurate stack trace if external debug information is missing and frames do
> not contain the needed information themselves.
> >
> > dl
> >
> > On 7/10/24 10:52 PM, Julian Waters wrote:
> >
> > Hi Dean,
> >
> > I eventually did find frame::link(), but ultimately it didn't seem to
> help as VMError::print_native_stack still doesn't work properly on Windows.
> It seems as though frame::link() calls addr_at on x86, which in turn calls
> frame::fp(), which returns _fp. I think whatever sets _fp for
> VMError::print_native_stack is the missing link here, but unfortunately I
> don't know where it's set
> >
> > The code that I tried on Windows x64 is attached below
> >
> > best regards,
> > Julian
> >
> > // VC++ does not save frame pointer on stack in optimized build. It
> > // can be turned off by -Oy-. If we really want to walk C frames,
> > // we can use the StackWalk() API.
> > frame os::get_sender_for_C_frame(frame* fr) {
> > #ifdef __GNUC__
> >   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
> > #elif defined(_MSC_VER)
> >   ShouldNotReachHere();
> >   return frame();
> > #endif
> > }
> >
> > frame os::current_frame() {
> > #ifdef __GNUC__
> >   frame f(reinterpret_cast<intptr_t*>(os::current_stack_pointer()),
> >           reinterpret_cast<intptr_t*>(__builtin_frame_address(1)),
> >           CAST_FROM_FN_PTR(address, &os::current_frame));
> >   if (os::is_first_C_frame(&f)) {
> >     // stack is not walkable
> >     return frame();
> >   } else {
> >     return os::get_sender_for_C_frame(&f);
> >   }
> > #elif defined(_MSC_VER)
> >   return frame();  // cannot walk Windows frames this way.  See
> os::get_native_stack
> >                    // and os::platform_print_native_stack
> > #endif
> > }
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-dev/attachments/20240711/98540c75/attachment.htm>


More information about the hotspot-dev mailing list