无法访问内存 – gdb

这是我的disas代码:

Dump of assembler code for function main: 0x00000000000006b0 : push %rbp 0x00000000000006b1 : mov %rsp,%rbp 0x00000000000006b4 : sub $0x10,%rsp 0x00000000000006b8 : movl $0xa,-0xc(%rbp) 0x00000000000006bf : lea -0xc(%rbp),%rax 0x00000000000006c3 : mov %rax,-0x8(%rbp) 0x00000000000006c7 : lea 0x96(%rip),%rdi # 0x764 0x00000000000006ce : mov $0x0,%eax 0x00000000000006d3 : callq 0x560  0x00000000000006d8 : mov $0x0,%eax 0x00000000000006dd : leaveq 0x00000000000006de : retq 

当我通过b * 0x00000000000006b4将断点设置为0x06b4并运行代码时它会发出错误Starting program: /root/print.out Warning: Cannot insert breakpoint 4. Cannot access memory at address 0x6b4但是当我使用b 4时并运行代码,它正常工作。 所以我在第一种情况下做错了什么。

Dump of assembler code for function main: 0x00000000000006b0 <+0>: push %rbp 0x00000000000006b1 <+1>: mov %rsp,%rbp

您正在查看与位置无关的可执行文件 (一种特殊的共享库)。 当可执行文件开始运行时, main的代码将重定位到不同的地址。

因为重定位可执行文件时0x6b4处没有代码,GDB会抱怨它无法在那里设置断点。

但是当我使用b 4并运行代码时,它正常工作。

在这种情况下,GDB了解您要在第4行设置断点,并在重定位可执行文件插入适当的断点。

使用info break查看重定位的地址。