相关疑难解决方法(0)

每次调试时变量的地址都会改变吗

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

我正在使用的代码:

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

编译: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
Run Code Online (Sandbox Code Playgroud)

但是,运行编译(可调试)a.out文件两次,它给出了不同的输出&p

heap=0x1c47010 stack=0x7ffd2df09b50
heap=0x25a5010 stack=0x7ffd757125f0
Run Code Online (Sandbox Code Playgroud)

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

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

c debugging gdb

9
推荐指数
1
解决办法
142
查看次数

为什么多次执行时局部变量的地址会有所不同,但是在使用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));
}
Run Code Online (Sandbox Code Playgroud)

我通过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  
$
Run Code Online (Sandbox Code Playgroud)

但是程序的正常执行总会产生SEGFAULT.

$ ./a.out   
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

我不知道这个问题是否重复这是否总是GDB调试程序的地址?

注意:我没有关闭ASLR

c gdb memory-management

6
推荐指数
1
解决办法
408
查看次数

C程序中变量的地址

#include <stdio.h>

main()
{
    int i = 5;
    printf("%d \n" , &i);
}
Run Code Online (Sandbox Code Playgroud)

重复执行上述程序会导致变量的地址不同i吗?

c

3
推荐指数
1
解决办法
200
查看次数

标签 统计

c ×3

gdb ×2

debugging ×1

memory-management ×1