For x86-64, esp isn't updated in stack unwind: [hjl@gnu-tools-1 tmp]$ cat foo.c void bar () { } int main () { bar (); return 0; } [hjl@gnu-tools-1 tmp]$ gcc -g foo.c [hjl@gnu-tools-1 tmp]$ gdb a.out GNU gdb (GDB) 7.5.50.20120930-cvs Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-unknown-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /tmp/a.out...done. (gdb) b bar Breakpoint 1 at 0x4004a0: file foo.c, line 4. (gdb) r Starting program: /tmp/a.out Breakpoint 1, bar () at foo.c:4 4 } (gdb) f 1 #1 0x00000000004004b0 in main () at foo.c:9 9 bar (); (gdb) p $pc $1 = (void (*)()) 0x4004b0 <main+14> (gdb) p $rsp $2 = (void *) 0x7fffffffdf90 (gdb) p $rip $3 = (void (*)()) 0x4004b0 <main+14> (gdb) p $sp $4 = (void *) 0x7fffffffdf90 (gdb) p/x $esp $5 = 0xffffdf80
It is not just esp, none of pseudo registers are updated. It is bad for esp and eip.
I believe this is fixed by my pseudo register series, that commit and the 20 or so previous ones: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=f5d420bbceeb1d5065c3d91dd7c6c1e43f855ca1 When running: ./gdb -batch -nx -q --data-directory=data-directory test \ -ex 'b foo' -ex r -ex bt \ -ex 'frame 0' \ -ex 'p/x $sp' -ex 'p/x $rsp' -ex 'p/x $esp' \ -ex 'frame 1' \ -ex 'p/x $sp' -ex 'p/x $rsp' -ex 'p/x $esp' Before, I get: #0 foo (x=2) at test.c:3 3 return x + 1; $1 = 0x7fffffffe180 $2 = 0x7fffffffe180 $3 = 0xffffe180 #1 0x0000555555555146 in main () at test.c:8 8 foo(2); $4 = 0x7fffffffe190 $5 = 0x7fffffffe190 $6 = 0xffffe180 After, I get: #0 foo (x=2) at test.c:3 3 return x + 1; $1 = 0x7fffffffe180 $2 = 0x7fffffffe180 $3 = 0xffffe180 #1 0x0000555555555146 in main () at test.c:8 8 foo(2); $4 = 0x7fffffffe190 $5 = 0x7fffffffe190 $6 = 0xffffe190 From what I can tell, from amd64-tdep.c, the eip pseudo register exists only on the x32 arch, which I can't test. But if it's handled like all other dword pseudo registers, it should work as well.