我是 GDB 的新手,很好奇在不同的调试过程中变量的地址是否会改变?
我正在使用的代码:
#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 是否会保证任何变量在不同的调试时间都具有相同的地址,为什么?
另外,为什么只是运行而不是调试似乎使用不同的方案?
为什么在从gdb运行代码时,我获得了声明的变量的相同地址,但是在执行二进制文件时我得不到相同的地址.
#include<stdio.h>
void main()
{
    int *x,q;
    //I saw the address of the variable q in this program through gdb during the __1st__ execution.
    //I re-compiled the program to make x to point to this address.
    x=0x7fffffffe2bc; 
    *x=3;
    printf("%d",(*x));
}
我通过gdb运行程序,它永远不会Segfaulted.
$ gdb -q ./a.out  
Reading symbols from /home/eknath/needed2/a.out...done.  
(gdb) r  
Starting program: /home/eknath/needed2/a.out   
3
Program exited normally.  
(gdb) q  
$
但是程序的正常执行总会产生SEGFAULT.
$ ./a.out   
Segmentation fault
我不知道这个问题是否重复这是否总是GDB调试程序的地址?
注意:我没有关闭ASLR
#include <stdio.h>
main()
{
    int i = 5;
    printf("%d \n" , &i);
}
重复执行上述程序会导致变量的地址不同i吗?