Memory 如何在没有源代码的情况下查找内存中的变量位置?

Memory 如何在没有源代码的情况下查找内存中的变量位置?,memory,gdb,Memory,Gdb,基本上我想在gdb中找到变量的地址/位置 我知道变量通常存储在rbp,但不知道如何使用gdb定位它们 我想在gdb中找到变量的地址/位置 这是可能的,但根据变量是全局变量还是局部变量,方法有所不同 我知道变量通常存储在rbp 局部变量存储在帧指针的某个偏移处。%在未优化的二进制文件中,RBP通常用作帧指针 要找到这样的变量,您需要知道如何读取机器代码,然后才能找到它。GDB不会帮助您在没有调试信息的情况下编译的代码中找到它,因为它不能 没有源代码 源代码与此无关-GDB从不查看源代码,只是向您显

基本上我想在gdb中找到变量的地址/位置

我知道变量通常存储在rbp,但不知道如何使用gdb定位它们

我想在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.
(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