gpt4 book ai didi

c - gdb调试整数打印信息

转载 作者:行者123 更新时间:2023-11-30 15:41:03 25 4
gpt4 key购买 nike

我正在尝试找出如何打印整数值(我看到它是 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>

我在主/乘/加中放置了一些断点,然后我尝试执行以下操作。

我用过 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>

最佳答案

我用 -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: 5

x/4d 将显示从该地址开始的 4 个值(4 是重复计数)。如果您在此处省略尺寸字母 wx 命令将默认为之前使用的尺寸。

(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

您的下一个问题:

Another interesting thing that I found is the following... Im sure that the first values are garbages. But why it considers 0x5 as an address when it should print the actual value?

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 寄存器的地址表达式。

关于c - gdb调试整数打印信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20712951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com