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

dean.long at oracle.com dean.long at oracle.com
Thu Jul 11 21:02:27 UTC 2024


Right.  It shows an alternative to print_native_stack to use with the 
Microsoft compiler.  If you are using a different compiler that stores 
the caller FP at frame::link_offset then following the example of other 
platforms, like Linux, should work.

dl

On 7/11/24 1:57 AM, Julian Waters wrote:
> 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/31e86e76/attachment-0001.htm>


More information about the hotspot-dev mailing list