Как найти расположение переменных в памяти без исходного кода? - PullRequest
0 голосов
/ 12 сентября 2018

Как правило, я хочу найти адрес / местоположение переменной в gdb?

Обычно я знаю, что переменная хранится в rbp, но не знаю, как найти их с помощью gdb.

1 Ответ

0 голосов
/ 13 сентября 2018

Я хочу найти адрес / местоположение переменной в GDB?

Это возможно, но подход отличается в зависимости от того, является ли переменная глобальной или локальной.

Обычно я знаю, что переменные хранятся в rbp

Локальные переменные хранятся с некоторым смещением указателя кадра.%RBP часто используется в качестве указателя кадра в неоптимизированных двоичных файлах.

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

без исходного кода

Исходный код имеет ничего общего с этим - GDB никогда не смотрит на исходный код, кроме как для его отображения.

На конкретном примере.Предположим, у вас есть следующий источник:

int foo(int *ip) { return *ip + 42; }
int main()
{
  int j = 1;
  return foo(&j);
}

Компиляция этого без отладочной информации и без оптимизаций, приводит к:

(gdb) disas main
Dump of assembler code for function main:
   0x000000000000060d <+0>:     push   %rbp
   0x000000000000060e <+1>:     mov    %rsp,%rbp
   0x0000000000000611 <+4>:     sub    $0x10,%rsp
   0x0000000000000615 <+8>:     movl   $0x1,-0x4(%rbp)
   0x000000000000061c <+15>:    lea    -0x4(%rbp),%rax
   0x0000000000000620 <+19>:    mov    %rax,%rdi
   0x0000000000000623 <+22>:    callq  0x5fa <foo>
   0x0000000000000628 <+27>:    leaveq
   0x0000000000000629 <+28>:    retq
End of assembler dump.

здесь вы можете ясно видеть, что j хранится вотрицательное смещение 4 выкл %rbp.

Вы можете установить точку останова на foo и использовать GDB для проверки ее значения следующим образом:

(gdb) b foo
Breakpoint 1 at 0x5fe
(gdb) run

Breakpoint 1, 0x00005555555545fe in foo ()
(gdb) up
#1  0x0000555555554628 in main ()
(gdb) x/x $rbp-4
0x7fffffffdbcc: 0x00000001      // indeed that is expected value of j
...