【发布时间】: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 在.text 的test 程序中。 gdb的follow-fork-mode是child,网上搜了还是解决不了。
一个月前我就这样调试成功了,不知道为什么现在不行了。但是如果像这样直接使用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 可能会导致其他问题。