Re: info frame

Mark Kettenis
2006-04-16T23:33:33Z

> From: Nick Roberts <nickrob@snap.net.nz>
> Date: Mon, 17 Apr 2006 11:15:45 +1200
>
> 'info frame' says that the frame is at a different address (0xbffff710)
> to $fp (0xbffff708). This wasn't the case with older versions e.g 5.2.1:
>
> nickrob/31 gdb myprog
> GNU gdb 5.2.1-2mdk (Mandrake Linux)
> Copyright 2002 Free Software Foundation, Inc.
> ...
> (gdb) inf frame
> Stack level 0, frame at 0xbffff728:
> eip = 0x80484a9 in main (myprog.c:47); saved eip 0x4006015a
> called by frame at 0xbffff768
> source language c.
> Arglist at 0xbffff728, args: argc=1, argv=0xbffff794
> Locals at 0xbffff728, Previous frame's sp is 0x0
> Saved registers:
> ebp at 0xbffff728, eip at 0xbffff72c
> (gdb) p $fp
> $1 = (void *) 0xbffff728
>
> nickrob/32 src/gdb/gdb myprog
> GNU gdb 6.4.50.20060405-cvs
> Copyright (C) 2006 Free Software Foundation, Inc.
> ...
> (gdb) info frame
> Stack level 0, frame at 0xbffff710:
> eip = 0x80484a9 in main (myprog.c:47); saved eip 0x4006015a
> source language c.
> Arglist at 0xbffff708, args: argc=1, argv=0xbffff774
> Locals at 0xbffff708, Previous frame's sp is 0xbffff710
> Saved registers:
> ebp at 0xbffff708, eip at 0xbffff70c
> (gdb) p $fp
> $1 = (void *) 0xbffff708
>
> Can this be right?

Yes, current GDB uses the convention that the frame address is the
Canonical Frame Address (CFA) as used by the DWARF 2 Call Frame Info
(CFI). In general the CFA is the value of the stack pointer when the
current function was called. Since on i386 the "call" instruction
pushes the return address on the stack, and the "standard" prologue:

push %ebp
mov %esp,%ebp

pushes another 32-bit word onto the stack, which gives the offset
0xbffff710 - 0xbffff708 = 8 that you're seeing.

Note that while %ebp is usually used as a frame pointer register, the
architecture doesn't actually force you to do that. Nowadays
compilers can and will generate frameless functions, and for those,
the value %ebp is meaningless.

Mark