Почему адрес локальной переменной изменяется при многократном выполнении, а не при отладке с помощью GDB? - PullRequest
6 голосов
/ 11 октября 2011

Почему при запуске кода из 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, и она никогда не перешла из-под контроля.

$ 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

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

Причина, по которой вы всегда получаете один и тот же адрес для локальных переменных при работе в GDB, заключается в том, что GDB (для упрощения большинства сценариев отладки) отключает рандомизацию адресного пространства.

Вы можете попросить GDB , а не сделать это с set disable-address-randomization off.

Для любопытства отключение рандомизации адресов для текущего процесса не не требует каких-либо привилегий и выполняется путем вызова personality(2). Вот патч , который добавил эту функцию.

0 голосов
/ 11 октября 2011

РЕДАКТИРОВАТЬ: Позвольте мне уточнить мою точку зрения, поскольку это, возможно, не было ясно.GDB по умолчанию отключает ASLR, поэтому ваши переменные всегда будут иметь один и тот же адрес (если только код не изменяется, добавление переменных или кода до или даже после того, как в некоторых случаях может вызвать сдвиг в назначенных адресах и привести к сбою).Таким образом, ваш код будет успешным, потому что жестко закодированные адреса будут в одном месте во время работы в GDB.Это помогает при отладке, поскольку адреса не изменятся от сеанса отладки до сеанса отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...