【问题标题】:Why doesn't reading back from the address of an int give me back the correct value of the int (C & gdb)为什么不从 int 的地址读回给我正确的 int 值(C & gdb)
【发布时间】:2019-01-29 05:00:09
【问题描述】:

我有一个使用 gdb 调试的 c 程序。这是在 Ubuntu x86 上完成的,c 程序是用 gcc 编译的。 我一个接一个地声明了两个 int 变量

int a = atoi (argv[1]);
int b = atoi (argv[2]);

我传递给它们的值分别是 2 和 4。现在我在这些行之后中断并调试。根据以下数据,int b 似乎从地址 0xbffff048 开始,占用 0xbffff048、0xbffff049、0xbffff04a、0xbffff04b。 int b 从下一个地址 0xbffff04c 开始也是有道理的。但是如果我显示这四个地址的值,我得到的十六进制不等于十进制 4(这是在应用程序中确认的 b 的值,并在 gdb 调试中打印)。我在这里解释/做错了什么?

(gdb) display a
2: a = 2
(gdb) display b
3: b = 4
(gdb) display &a
4: &a = (int *) 0xbffff04c
(gdb) display &b
5: &b = (int *) 0xbffff048
(gdb) x  0xbffff048
0xbffff048:     0x00000004
(gdb) x  0xbffff049
0xbffff049:     0x02000000
(gdb) x  0xbffff04a
0xbffff04a:     0x00020000
(gdb) x  0xbffff04b
0xbffff04b:     0x00000200

【问题讨论】:

  • 看起来您将内存显示为整数,而不是字节,所以当您查看 49 时,您会得到三个字节的 a 和一个字节的 b 看到那个 2 了吗?那是来自b 的 2。当你在内存中推进一个字节时,2 会移动,直到你到达 4c 时它被插入到正确的位置。
  • x 命令显示从给定地址开始的四个字节,以小端顺序解释。从&b 开始的内存看起来像04 00 00 00 02 00 00 00。所以x 0xbffff049 读取00 00 00 02 并将其显示为0x02000000
  • 您通常使用printdisplay 在每一步或断点之后设置一个要打印的表达式。

标签: c x86 gdb


【解决方案1】:

您看到的值 2 在为整数指定的 4 个字节之后。你的输入 4 就在那里占据了第一个半字节。

我认为 cmets 解释得更好。

【讨论】:

  • 如果您解释说 x /xb 0xbffff049 将检查 hex 格式的一个字节 (b),这将是一个更好的答案。 x 命令的默认大小是您之前使用的任何大小,或者在启动时为 32 位。
猜你喜欢
  • 2015-09-13
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2018-09-09
  • 2015-01-02
  • 2020-04-13
相关资源
最近更新 更多