Как прочитать адрес памяти в GDB для разборки кода процессора i7? - PullRequest
0 голосов
/ 28 февраля 2012

Я пытаюсь прочитать расположение переменной в памяти во время выполнения, используя gdb в Eclipse, но не могу понять, какой из них является правильным адресом Вот вывод gdb при разборке моей программы:

                  main():
0000000000400634:   push %rbp
0000000000400635:   mov %rsp,%rbp
 5                  int i = 7;
0000000000400638:   movl $0x7,-0x4(%rbp)
 6                  int j = 8;
000000000040063f:   movl $0x8,-0x8(%rbp)
 8                  return 0;
0000000000400646:   mov $0x0,%eax
 9                }

и что я хочу, это местоположение переменной i во время выполнения. Я предполагаю, что это -0x4 (% rbp), но тогда как мне определить, что это за адрес?

Должен ли я взять текущее значение rbp и вычесть из него 4? В этом случае значение внутри rbp равно 0x7fffffffe250. Таким образом, будет ли расположение i в памяти во время выполнения 0x7fffffffe250 - 0x4? Или это просто 0x7fffffffe250?

1 Ответ

1 голос
/ 28 февраля 2012

Ваше предположение верно: принимая значение %ebp внутри этой функции и вычитая 4, вы получите адрес, по которому хранится i. Однако этот адрес непредсказуем, поскольку зависит от позиции стека во время выполнения.

Кроме того, вы должны иметь в виду, что не все переменные будут иметь фиксированное местоположение, либо в памяти, либо в регистре - компилятор может в конечном итоге переместить значение между несколькими местоположениями или полностью оптимизировать промежуточное значение, если оно нет необходимости.

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