【问题标题】:gdb can't insert a breakpoint when attach to a process附加到进程时gdb无法插入断点
【发布时间】:2017-03-18 13:02:24
【问题描述】:

我正在尝试将gdb 附加到由socat 启动的程序,如下所示:

socat TCP-LISTEN:5678,reuseaddr,fork EXEC:./test

在另一个终端,

sudo gdb 
attach `pidof socat`
br *0x080487D4

在gdb中执行continue命令时,报错如下:

Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x80487d4

Command aborted.

0x080487D4 在.texttest 程序中。 gdb的follow-fork-modechild,网上搜了还是解决不了。

一个月前我就这样调试成功了,不知道为什么现在不行了。但是如果像这样直接使用gdb调试程序就可以了:

gdb -q ./test

但是,上面的方式不能满足我的需求。

通过调试,我认为gdb 期望地址是socat 中的有效地址,而不是test 程序。那么如何在test 程序中设置断点呢? test 程序中没有断点,在执行continue 命令时会直接运行到最后。在socat程序中设置断点是没有用的。

有什么建议吗?提前致谢。

【问题讨论】:

  • 您如何确定该地址是正确的地址?我没有看到您正在做任何事情来确定socat 在内存中的映射位置。你是编译成 PIE 代码吗?
  • 你认为你为什么需要 sudo?
  • @DavidHoelzer,感谢您的回复。该地址是在反编译test程序时从Ida pro获得的,与socat无关。当一个进程用 socat 分叉时,gdb 会跟随子进程test,所以我在那个地址上设置了一个断点。我应该在socat 而不是test 程序中设置断点吗?
  • @sigjuice。有时,如果没有sudo,它将无法附加到进程。即使没有sudo,问题依然存在。
  • 要么一直需要 sudo,要么根本不需要。不必要地使用 sudo 可能会导致其他问题。

标签: c debugging gdb


【解决方案1】:

我已经弄清楚如何在test 程序中设置断点。

当使用socat 启动test 程序时,它不会派生test 进程,直到套接字连接到来。所以试图直接在test 程序中设置断点失败。

我使用一个工具(出于我的目的,选择pwntools)连接到它并挂起它,然后使用gdb 附加到分叉的test 进程。接下来就可以正常调试了。

有更好的想法吗?提前致谢。

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 2017-12-23
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多