gdb在附加到进程时无法插入断点

4
我想把 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在test程序的.text部分。gdb的follow-fork-modechild,我已经在线搜索过但仍然无法解决。

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

gdb -q ./test

然而,上述方法并不能满足我的需求。
通过调试,我认为期望地址是socat中的有效地址,而不是test程序中的地址。那么我该如何在test程序中设置断点呢?如果没有在test程序中设置断点,当执行continue命令时,它将直接运行到结束。在socat程序中设置断点是无用的。
有什么建议吗?谢谢您的帮助。

你是如何确定那个地址是正确的地址的?我没有看到你做任何事情来确定socat在内存中被映射到哪里。你是否编译为PIE代码? - David Hoelzer
@DavidHoelzer,感谢您的回复。该地址是从反编译“test”程序时从Ida pro获取的,与“socat”无关。当一个进程使用socat分叉时,gdb将跟随子进程“test”,因此我在该地址上设置了断点。我应该在socat而不是test程序中设置断点吗? - cq674350529
@sigjuice。有时候它会在没有“sudo”的情况下无法附加到进程上。 即使没有“sudo”,问题仍然存在。 - cq674350529
你要么一直使用sudo,要么就不用。不必要地使用sudo可能会导致其他问题。 - sigjuice
当你说“一个月前它工作了”,是指相同的test可执行文件和相同的地址0x080487D4吗? - sigjuice
显示剩余4条评论
1个回答

2

我已经找到了如何在test程序中设置断点的方法。

使用socat启动test程序时,只有在有socket连接时才会fork一个test进程。因此,尝试直接在test程序中设置断点会失败。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接