gpt4 book ai didi

c++ - 使用 GDB 并检查 Data 的内存布局

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:52 24 4
gpt4 key购买 nike

假设我们有一个简单的 C++ 代码如下:

#include <iostream>

int main(){
int a = 5;
}

因为每个内存位置都是 8 位 并且一个整数是 32 位 我假设 a 的内存结构是这样的:

0xa      0xb      0xc      0xd 
00000000 00000000 00000000 00000101

其中 0xa、0xb、0xc、0xd 是示例内存地址。

1) &a是指向0xa还是0xd

2) 如果我使用 GDB 并使用 x 获取实际内存地址,我会得到以下信息:

(gdb) p a
$7 = 5
(gdb) p &a
$8 = (int *) 0x7ffeefbffac8
(gdb) x/bt 0x7ffeefbffac8
0x7ffeefbffac8: 00000101
(gdb) x/bt 0x7ffeefbffac8-1
0x7ffeefbffac7: 00000000
(gdb) x/bt 0x7ffeefbffac8-2
0x7ffeefbffac6: 00000000
(gdb) x/bt 0x7ffeefbffac8-3
0x7ffeefbffac5: 01111111
(gdb)

为什么 0x7ffeefbffac8-3 填充了 01111111 而不是 00000000?在我们的示例内存地址中,这个地址不等于 0xa 吗?

最佳答案

在小端机器上,&a 指向内存的最低有效字节。也就是说,如果&a == 0x7ffeefbffac8,则a驻留在字节中

0x7ffeefbffac8:  101   << least significant byte
0x7ffeefbffac9: 000
0x7ffeefbffaca: 000
0x7ffeefbffacb: 000 << most significant byte.

最好通过分配例如0x0a090705a,然后:

Temporary breakpoint 1, main (argc=3, argv=0x7fffffffdc68) at t.c:2
2 int a = 0x0a090705;
(gdb) n
3 return 0;
(gdb) p &a
$1 = (int *) 0x7fffffffdb7c

检查从 &a 开始的 4 个字节:

(gdb) x/4bt 0x7fffffffdb7c
0x7fffffffdb7c: 00000101 00000111 00001001 00001010

或者,等价地,一次一个字节:

(gdb) x/bt 0x7fffffffdb7c
0x7fffffffdb7c: 00000101
(gdb) x/bt 0x7fffffffdb7c+1
0x7fffffffdb7d: 00000111
(gdb) x/bt 0x7fffffffdb7c+2
0x7fffffffdb7e: 00001001
(gdb) x/bt 0x7fffffffdb7c+3
0x7fffffffdb7f: 00001010

why is 0x7ffeefbffac8-3 populated with 01111111 and not 00000000?

因为你走错了方向:&a-3 根本不是 a 的一部分 (它是其他东西的一部分,或者可能是未初始化的随机垃圾)。

关于c++ - 使用 GDB 并检查 Data 的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54382716/

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