Bug 14673 - Pseudo registers aren't updated in stack unwind
Summary: Pseudo registers aren't updated in stack unwind
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: tdep (show other bugs)
Version: unknown
: P2 normal
Target Milestone: 15.1
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-10-05 01:19 UTC by H.J. Lu
Modified: 2023-12-15 16:43 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description H.J. Lu 2012-10-05 01:19:18 UTC
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
Comment 1 H.J. Lu 2012-10-05 02:07:28 UTC
It is not just esp, none of pseudo registers are updated.
It is bad for esp and eip.
Comment 2 Simon Marchi 2023-12-14 16:46:24 UTC
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.