【发布时间】: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。 -
您通常使用
print。display在每一步或断点之后设置一个要打印的表达式。