我试图找出如何打印一个整数值(我看到它是x/d),但我遗漏了一些东西。
所以,我的代码如下
1 #include <stdio.h>
2 main(){
3 int a;
4 int b;
5 int c;
6 int d;
7 int multiplied;
8 a = 5;
9 b = 6;
10 c = 7;
11 d = adding(a,b,c);
12 multiplied = multiply(a,b,c);
13 printf("The value of d is %d \n",d);
14 printf("The multiplied values are %d \n", multiplied);
15 }
16 int adding(a,b,c){
17 int e;
18 e = a+b+c;
19 return e;
20 }
21 int multiply(a,b,c){
22 int f = a*b*c;
23 return f;
24 }//我用-q编译,我想打印变量的值(从它们的地址),所以.
(gdb) disassemble main
0x080483ed <+9>: mov DWORD PTR [esp+0x2c],0x5
0x080483f5 <+17>: mov DWORD PTR [esp+0x28],0x6
0x080483fd <+25>: mov DWORD PTR [esp+0x24],0x7
0x08048405 <+33>: mov eax,DWORD PTR [esp+0x24] <code>我在main /相乘/添加中放置了一些断点,然后我尝试执行以下操作。
我使用了print $esp+0x24和(gdb) x/4d 0xbffff47c,但是我没有得到正确的答案。
我之所以使用4d,是因为我认为整数是4个字节(或者可能又遗漏了什么),但是结果没有显示值5。你能帮我吗?感谢和抱歉的不良输出/格式的gdb..。说真的,我不明白出了什么问题
(gdb) print $esp+0x2c
$2 = (void *) 0xbffff494
(gdb) print $esp+0x28
$3 = (void *) 0xbffff490
(gdb) print $esp+0x24
$4 = (void *) 0xbffff48c
(gdb) x/d 0xbffff494
0xbffff494: -1208180748
(gdb) x/d 0xbffff490
0xbffff490: -1208179932
(gdb) x/d 0xbffff48c
0xbffff48c: 134513881当然,这也发生在main的第一个断点之后,实际上所有断点中都会出现相同的值(除了main.之前的一个)。
我发现的另一个有趣的事情是.我确信第一个值是垃圾。但是,当它应该打印实际值时,为什么将0x5作为一个地址呢?
Breakpoint 1, main () at functioncalling.c:10
10 a = 5;
(gdb) x/s a
0xb7fc9ff4: "|M\025"
(gdb) cont
Continuing.
Breakpoint 3, adding (a=5, b=6, c=7) at functioncalling.c:21
21 e = a+b+c;
(gdb) x/s a
0x5: <Address 0x5 out of bounds>发布于 2013-12-21 14:56:26
我用-g编译了您的程序,没有进行优化,并在第11行之前设置了断点。我的堆栈地址与您的堆栈地址有点不同,考虑到系统的多样性,这并不奇怪。
(gdb) print $esp+0x2c
$2 = (void *) 0xbffff44c这是打印a的地址。确认:
(gdb) print &a
$4 = (int *) 0xbffff44c使用x/wd以小数表示4字节整数.
(gdb) x/wd $esp+0x2c
0xbffff44c: 5x/4d将显示从地址开始的4个值(4是重复计数)。如果在这里省略大小字母w,则x命令将默认为以前使用的大小。
(gdb) x/4d $esp+0x2c
0xbffff44c: 5 134513856 0 -1073744680这是你的5。至于其他的3个数字,它们是堆的更高的东西。
(gdb) x/4a $esp+0x2c
0xbffff44c: 0x5 0x80484c0 <__libc_csu_init> 0x0 0xbffff4d8你的下一个问题:
我发现的另一个有趣的事情是.我确信第一个值是垃圾。但是,当它应该打印实际值时,为什么将0x5作为一个地址呢?
Breakpoint 3, adding (a=5, b=6, c=7) at functioncalling.c:21
21 e = a+b+c;
(gdb) x/s a
0x5: <Address 0x5 out of bounds>当给定程序的变量作为参数时,x命令将检索其值并使用该值作为地址。x/s a的意思是检索a中的值,并将其用作以NUL结尾的字符串的起始地址。如果a是char *型,并且包含一个合适的值,x/s会打印出合理的输出。要打印a的实际值,请给x命令参数&a。
(gdb) x/wd &a
0xbffff44c: 5这似乎违反了直觉。只需考虑x命令就可以像C语句printf(fmt, *(argument))那样操作。x命令的参数几乎总是一个文字内存地址或涉及堆栈指针、基指针或pc寄存器的地址表达式。
https://stackoverflow.com/questions/20712951
复制相似问题