每次调试[重复]时,变量的地址是否会改变?

问题描述 投票:8回答:1

我是GDB的新手,很好奇在不同的调试过程中,varaible的地址是否会改变?

我使用的代码是这样的

#include <stdio.h>
int main()
{
   char * p = malloc(10);
   printf("heap=%p stack=%p\n", p, &p);
}

编译gcc main.c -g

在我的Ubuntu中,GDB控制台显示了3次相同的结果。

gdb$ b 5
Breakpoint 1 at 0x4005fb: file main4.c, line 5.
gdb$ r
Starting program: /home/zz/work/bold/src/a.out
Breakpoint 1, main () at main4.c:5
gdb$ p &p
$1 = (char **) 0x7fffffffe060

然而,运行编译后的(可调试的) a.out 文件两次,它给不同的输出 &p:

heap=0x1c47010 stack=0x7ffd2df09b50
heap=0x25a5010 stack=0x7ffd757125f0

GDB是否会保证任何变量在不同的调试时间都在同一个地址,为什么?

还有,为什么只是运行而不是调试,似乎使用了不同的方案?

c debugging gdb
1个回答
10
投票

大多数Linux系统都启用了地址空间布局随机化(ASLR)。在ASLR下,地址空间的许多部分,包括可执行文件、堆和栈,每次都以随机地址加载。这就是你在运行 a.out 直接进行调试。

GDB默认情况下是禁用ASLR的,以使调试更可预测。这是一个可配置的选项,可以打开或关闭。从 全球开发银行手册:

设置禁用-随机化

设置为禁用-随机化

这个选项(在GDB中默认启用)将关闭启动程序的虚拟地址空间的本机随机化。这个选项对于多个调试会话很有用,可以使执行的重现性更好,而且内存地址在各个调试会话中可以重复使用。

设置disable-randomization off

保持已启动的可执行文件的行为不变。

© www.soinside.com 2019 - 2024. All rights reserved.