我有一个简单的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
两个值似乎相差不远,但为什么我得不到相同的结果?如果您需要更多信息,请告诉我,并提前感谢您的帮助
1条答案
按热度按时间ckx4rj1h1#
一些操作系统将地址随机化作为一种安全措施,例如,在Linux上,该特性被称为Address Space Layout Randomization(ASLR),并且默认启用。
默认情况下,GDB会禁用地址空间随机化,所以你在GDB下运行时看到的地址应该是一致的,使用
show disable-randomization
查看是否禁用了随机化。您总是可以使用
set disable-randomization off
来关闭禁用功能,然后将随机化功能保留为打开(如果操作系统默认打开的话),但这在调试时很少有帮助。