【问题标题】:Cannot access memory - gdb无法访问内存 - gdb
【发布时间】:2017-03-24 11:53:59
【问题描述】:

这是我的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 并运行代码时,它工作正常。那么在第一种情况下我做错了什么。

【问题讨论】:

  • 你检查过断点工作时的地址吗?它们与反汇编匹配吗?
  • 是的,它们是一样的
  • 那些地址非常低。您能否编辑您的问题以添加对您的操作系统、编译设置、gdb 命令行选项等的描述?
  • 那些反汇编的指令偏移看起来是在链接器“重新定位”代码之前。强烈建议始终使用程序中存在的标签(如函数名称和/或您放置在源代码中的标签和/或函数名称 + 偏移量

标签: c gdb


【解决方案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查看重定位地址是什么。

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2013-10-30
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    相关资源
    最近更新 更多