首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gdb调试整数打印信息

gdb调试整数打印信息
EN

Stack Overflow用户
提问于 2013-12-20 22:31:16
回答 1查看 4.5K关注 0票数 1

我试图找出如何打印一个整数值(我看到它是x/d),但我遗漏了一些东西。

所以,我的代码如下

代码语言:javascript
复制
 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编译,我想打印变量的值(从它们的地址),所以.

代码语言:javascript
复制
(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..。说真的,我不明白出了什么问题

代码语言:javascript
复制
(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作为一个地址呢?

代码语言:javascript
复制
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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-21 14:56:26

我用-g编译了您的程序,没有进行优化,并在第11行之前设置了断点。我的堆栈地址与您的堆栈地址有点不同,考虑到系统的多样性,这并不奇怪。

代码语言:javascript
复制
(gdb) print $esp+0x2c
$2 = (void *) 0xbffff44c

这是打印a的地址。确认:

代码语言:javascript
复制
(gdb) print &a
$4 = (int *) 0xbffff44c

使用x/wd以小数表示4字节整数.

代码语言:javascript
复制
(gdb) x/wd $esp+0x2c
0xbffff44c: 5

x/4d将显示从地址开始的4个值(4是重复计数)。如果在这里省略大小字母w,则x命令将默认为以前使用的大小。

代码语言:javascript
复制
(gdb) x/4d $esp+0x2c
0xbffff44c: 5   134513856   0   -1073744680

这是你的5。至于其他的3个数字,它们是堆的更高的东西。

代码语言:javascript
复制
(gdb) x/4a $esp+0x2c
0xbffff44c: 0x5 0x80484c0 <__libc_csu_init> 0x0 0xbffff4d8

你的下一个问题:

我发现的另一个有趣的事情是.我确信第一个值是垃圾。但是,当它应该打印实际值时,为什么将0x5作为一个地址呢?

代码语言:javascript
复制
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结尾的字符串的起始地址。如果achar *型,并且包含一个合适的值,x/s会打印出合理的输出。要打印a的实际值,请给x命令参数&a

代码语言:javascript
复制
(gdb) x/wd &a
0xbffff44c: 5

这似乎违反了直觉。只需考虑x命令就可以像C语句printf(fmt, *(argument))那样操作。x命令的参数几乎总是一个文字内存地址或涉及堆栈指针、基指针或pc寄存器的地址表达式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20712951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档