Re: Specify frame by address

Mark Kettenis
2011-10-29T18:43:59Z

> Date: Sat, 29 Oct 2011 20:02:42 +0200
> From: Eli Zaretskii <eliz@gnu.org>
>
> > Date: Sat, 29 Oct 2011 19:46:38 +0200
> > From: Jan Kratochvil <jan.kratochvil@redhat.com>
> > Cc: gdb@sourceware.org
> >
> > "address of the frame" is frame_id.stack_addr. For DWARF it is CFA
> > (dwarf2_frame_cfa), which is for most arches just unwound SP (not PC!), that
> > is SP as shown by GDB in the caller.
>
> Thanks.
>
> What is it for stabs? More generally, suppose I wanted to make the
> manual more clear on this matter, what could I tell the user about
> how to find out this address?

The debug info format isn't really relevant. It's the architecture
that matters. The address is typically the value of the stack pointer
just before doing the function call, or the value of the stack pointer
upon function entry. We try to make sure that all unwinders agree on
the convention used, which is why for most architectures we use the
same convention as used by GCC for calculating the DWARF CFA, such
that the architecture-independent DWARF unwinder uses the same
convention as the architecture-specific unwinders that are used if no
DWARF debug info is available.

The frame address is printed by the "info frame":

Breakpoint 1, 0x000000000042b910 in main ()
(gdb) info frame
Stack level 0, frame at 0x7f7ffffbc350:
rip = 0x42b910 in main; saved rip 0x42b761
Arglist at 0x7f7ffffbc340, args:
Locals at 0x7f7ffffbc340, Previous frame's sp is 0x7f7ffffbc350
Saved registers:
rip at 0x7f7ffffbc348

So on amd64 the convention is that the frame address is the stack
pointer before the function call was made.

> > Such command really needs to iterate the frames and compare PC there.
>
> Right. I hoped that I could reference the frame by the PC address.

That wouldn't work. Functions are sometimes called recursively, so
diffrerent frames may end up with the same PC address.