特定内存地址上的内容与 gdb 中的预期不同

content on particular memory address is different than was expected in gdb

我有一个 int 类型的变量 i,它的值为 129。我在 gdb 中使用过这个变量的各种表示形式。

# Decimal format of i
(gdb) p/d i
 = 129


# Binary format of i
(gdb) p/t i
 = 10000001


# Address of variable i
(gdb) p &i
 = (int *) 0xbffff320


# Binary format displayed at one byte
(gdb) x /tb &i
0xbffff320:     10000001


# Decimal format displayed at four bytes (one word)
(gdb) x /dw &i
0xbffff320:     129


# Decimal format displayed at one byte
(gdb) x /db &i
0xbffff320:     -127

以上输出可能是因为10000001根据这个补码等于-127page如有错误请指正

据此:

# Size of int in bytes:
(gdb) p sizeof(int)
 = 4

我知道 int 在计算机内存中占用 4 个字节。因此,如果我的理解是正确的,那么数字驻留在内存中的某个地址上并占用 4 个字节(或 32 位,或 1 个字或 1/2 个巨字)。那么这个数字的表示形式是这样的:

AAAAAAAA: XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

哪里

AAAAAAAA is the location in memory and
XXXXXXXX is the bits of that number (i have divided this bits into four octets for better understanding)

因此,当我访问 int 数字时,我需要知道它的地址以及它消耗了多少位。因此 int 占用 32 位,可以使用 & 运算符获取地址。这是我在内存中的实际 int 表示(顺便说一句,为什么两个不同是与系统上的字节序设置有关还是什么?):

# Binary format displayed as one word (4 bytes) (I have put space between group of 8 bits for better understanding)
(gdb) x /tw &i
0xbffff320:     00000000 00000000 00000000 10000001

# Binary format displayed as four bytes
(gdb) x/4tb &i
0xbffff320:     10000001        00000000        00000000        00000000

现在学一点基础数学:

0xbffff320:     00000000 00000000 00000000 10000001
AAAAAAAA:       XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
AAAAAAAA:       8bits    8bits    8bits    8bits

8*3=24
(24)DEC == (0x18)HEX
0xbffff320 + 0x18 = 0xBFFFF338

0xBFFFF338 应该是我最后一个八位字节的地址。那么为什么这给了我 11001100 而不是 10000001

(gdb) x/tb 0xBFFFF338
0xbffff338:     11001100

我正在打印一个字节。如果我正在打印消耗 4 个字节的整个 int(我不认为这在我的情况下是可能的,因为我没有对应于这个内存的变量名,但你明白了)它可能是一些奇怪的数字,因为我我在声明的变量之后访问内存,可能会有一些垃圾,而且我的 10000001 会驻留在最重要的八位字节中,但为什么是现在?

编辑: 根据建议,我添加了 3 个字节而不是之前的 24 个字节,但结果仍然是错误的:

(3)DEC == (3)HEX
0xbffff320 + 0x3 = 0xbffff323

(gdb) x/tb 0xbffff323
0xbffff323:     00000000

还是不行 return 10000001这里有什么问题?

保持简单。该表达式向地址添加了 24 个字节,而不是向地址添加了 24 位。

看来你已经自己解决了这个问题:

(gdb) x /tb &i
0xbffff320:     10000001  #### Look at the address of this byte ####

# Binary format displayed as four bytes
(gdb) x/4tb &i
0xbffff320:     10000001        00000000        00000000        00000000
#                +0              +1             +2               +3

整数是从最低有效字节开始存储的。其他 3 个字节包含 00000000

所以大概

(gdb) x/tb 0xbffff320
0xbffff320:     10000001

(gdb) x/tb 0xbffff321
0xbffff321:     00000000

(gdb) x/tb 0xbffff322
0xbffff322:     00000000

(gdb) x/tb 0xbffff323
0xbffff323:     00000000