Я хочу найти адрес / местоположение переменной в 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