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