C语言 为什么我在使用p &var时会得到gdb中变量的错误地址?

pgvzfuti  于 2023-03-07  发布在  其他
关注(0)|答案(1)|浏览(99)

我有一个简单的c程序:

int x = 0;

void main() {
        int y = 1;
        printf("x: %d\n", x);
        printf("y: %d\n", y);
        printf("&x: %p\n", (void*) &x);
        printf("&y: %p\n", (void*) &y);
}

我用gcc -g simple.c编译了它
现在我运行./simple并得到:

&x: 0x557123835014
&y: 0x7ffcad2a35f4

但是当我尝试用gdb检索地址时,我得到了不同的结果。我的步骤:

gdb ./simple

(gdb) b main

(gdb) run

(gdb) step
(gdb) step

(gdb) p &x
$4 = (int *) 0x555555558014 <x>
(gdb) p&y
$5 = (int *) 0x7fffffffde14

两个值似乎相差不远,但为什么我得不到相同的结果?如果您需要更多信息,请告诉我,并提前感谢您的帮助

ckx4rj1h

ckx4rj1h1#

一些操作系统将地址随机化作为一种安全措施,例如,在Linux上,该特性被称为Address Space Layout Randomization(ASLR),并且默认启用。
默认情况下,GDB会禁用地址空间随机化,所以你在GDB下运行时看到的地址应该是一致的,使用show disable-randomization查看是否禁用了随机化。
您总是可以使用set disable-randomization off来关闭禁用功能,然后将随机化功能保留为打开(如果操作系统默认打开的话),但这在调试时很少有帮助。

相关问题