【发布时间】:2018-07-16 14:33:47
【问题描述】:
我正在通过 gdb 软件研究 C 程序的体系结构。我做了以下程序来检查堆栈的操作。
我使用下面的代码。
#include <stdio.h>
void foo(double x, double y)
{
double a=255;
double b=255;
double c=255;
double d=255;
double e=255;
double f=255;
double g=255;
double h=255;
double i=255;
double j=255;
double k=255;
double l=255;
double m=255;
double o=255;
double p=255;
double a1=255;
double b1=255;
double c1=255;
double d1=255;
double e1=255;
double f1=255;
double g1=255;
double h1=255;
double i1=255;
double j1=255;
double a2=255;
double b2=255;
double c2=255;
double d2=255;
double e2=255;
double f2=255;
double g2=255;
double h2=255;
double i2=255;
double j2=255;
c=a+b;
}
double main()
{
foo(255,255);
return 0;
}
编译程序
gcc -g -o exemplo01 exemplo01.c
我在 main 函数中设置了断点并在 gdb 中运行程序,我正在执行 'step' 命令并查看 SP 寄存器的内容,但它并没有改变值。当我在 foo 函数中创建变量时,它不应该叠加吗?
ricardobarbosa@isadora:~/dev/c/pilha$ gdb exemplo01
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from exemplo01...done.
(gdb) b main
Breakpoint 1 at 0x40074d: file exemplo01.c, line 50.
(gdb) run
Starting program: /home/ricardobarbosa/dev/c/pilha/exemplo01
Breakpoint 1, main () at exemplo01.c:50
50 foo(255,255);
(gdb) list
45 c=a+b;
46 }
47
48 double main()
49 {
50 foo(255,255);
51 return 0;
52 }
53
(gdb) s
foo (x=255, y=255) at exemplo01.c:5
5 double a=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
6 double b=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
7 double c=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
8 double d=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
9 double e=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
10 double f=255;
(gdb)
11 double g=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
12 double h=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
13 double i=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
14 double j=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
15 double k=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
16 double l=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
17 double m=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
18 double o=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
19 double p=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
21 double a1=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
22 double b1=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
23 double c1=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
24 double d1=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
25 double e1=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
26 double f1=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
27 double g1=255;
(gdb) i r $rsp
rsp 0x7fffffffdaf0 0x7fffffffdaf0
(gdb) n
28 double h1=255;
(gdb)
知道我做错了什么吗?还是我的理解不正确? 根据我的研究,随着我在函数中使用变量,堆栈会增长,并且堆将成为分配区域,对吗?
转储内存
(gdb) x/128db $rsp
0x7fffffffdaf0: 0 0 0 0 0 -32 111 64
0x7fffffffdaf8: 0 0 0 0 0 -32 111 64
0x7fffffffdb00: 0 0 0 0 0 -32 111 64
0x7fffffffdb08: 0 0 0 0 0 -32 111 64
0x7fffffffdb10: 0 0 0 0 0 -32 111 64
0x7fffffffdb18: 0 0 0 0 0 -32 111 64
0x7fffffffdb20: 0 0 0 0 0 -32 111 64
0x7fffffffdb28: 0 0 0 0 0 -32 111 64
0x7fffffffdb30: 0 0 0 0 0 -32 111 64
0x7fffffffdb38: 0 0 0 0 0 -32 111 64
0x7fffffffdb40: 46 78 61 -10 0 0 0 0
0x7fffffffdb48: 11 3 64 0 0 0 0 0
0x7fffffffdb50: -1 -1 -1 -1 0 0 0 0
0x7fffffffdb58: -72 -36 -1 -1 -1 127 0 0
0x7fffffffdb60: -8 81 -94 -9 -1 127 0 0
0x7fffffffdb68: -64 116 -1 -9 -1 127 0 0
(gdb)
(gdb) x/128db $rsp-128
0x7fffffffda70: -56 93 -94 -9 -1 127 0 0
0x7fffffffda78: 0 0 0 0 0 -32 111 64
0x7fffffffda80: 0 0 0 0 0 -32 111 64
0x7fffffffda88: 51 8 0 0 1 0 0 0
0x7fffffffda90: 0 0 0 0 0 -32 111 64
0x7fffffffda98: 0 0 0 0 0 -32 111 64
0x7fffffffdaa0: 0 0 0 0 0 -32 111 64
0x7fffffffdaa8: 0 0 0 0 0 -32 111 64
0x7fffffffdab0: 0 0 0 0 0 -32 111 64
0x7fffffffdab8: 0 0 0 0 0 -32 111 64
0x7fffffffdac0: 0 0 0 0 0 -32 111 64
0x7fffffffdac8: 0 0 0 0 0 -32 111 64
0x7fffffffdad0: 0 0 0 0 0 -32 111 64
0x7fffffffdad8: 0 0 0 0 0 -32 111 64
0x7fffffffdae0: 0 0 0 0 0 -32 111 64
0x7fffffffdae8: 0 0 0 0 0 -32 111 64
(gdb) x/128db $rsp+128
0x7fffffffdb70: -56 -31 -1 -9 -1 127 0 0
0x7fffffffdb78: 0 0 0 0 0 0 0 0
0x7fffffffdb80: 1 0 0 0 0 0 0 0
0x7fffffffdb88: -35 7 64 0 0 0 0 0
0x7fffffffdb90: -64 -37 -1 -1 -1 127 0 0
0x7fffffffdb98: 0 0 0 0 0 0 0 0
0x7fffffffdba0: -112 7 64 0 0 0 0 0
0x7fffffffdba8: -64 -37 -1 -1 -1 127 0 0
0x7fffffffdbb0: 120 7 64 0 0 0 0 0
0x7fffffffdbb8: 0 0 0 0 0 -32 111 64
0x7fffffffdbc0: 0 0 0 0 0 0 0 0
0x7fffffffdbc8: 69 111 -93 -9 -1 127 0 0
0x7fffffffdbd0: 0 0 0 0 0 0 0 0
0x7fffffffdbd8: -88 -36 -1 -1 -1 127 0 0
0x7fffffffdbe0: 0 0 0 0 1 0 0 0
0x7fffffffdbe8: 69 7 64 0 0 0 0 0
(gdb)
【问题讨论】:
-
您应该检查汇编代码(
gcc中的-S选项)。我认为编译器在输入函数之前会计算堆栈大小。
标签: c gdb cpu-registers