无法访问内存 - gdb

时间:2017-03-21 09:22:40

标签: c gdb

这是我的disas代码:

Dump of assembler code for function main:
0x00000000000006b0 <+0>:    push   %rbp
0x00000000000006b1 <+1>:    mov    %rsp,%rbp
0x00000000000006b4 <+4>:    sub    $0x10,%rsp
0x00000000000006b8 <+8>:    movl   $0xa,-0xc(%rbp)
0x00000000000006bf <+15>:   lea    -0xc(%rbp),%rax
0x00000000000006c3 <+19>:   mov    %rax,-0x8(%rbp)
0x00000000000006c7 <+23>:   lea    0x96(%rip),%rdi        # 0x764
0x00000000000006ce <+30>:   mov    $0x0,%eax
0x00000000000006d3 <+35>:   callq  0x560 <printf@plt>
0x00000000000006d8 <+40>:   mov    $0x0,%eax
0x00000000000006dd <+45>:   leaveq 
0x00000000000006de <+46>:   retq 

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

1 个答案:

答案 0 :(得分:1)

  

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

您正在查看position-independent executable(一种特殊的共享库)。当可执行文件开始运行时,main的代码将重定位到另一个地址。

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

  

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

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

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