0

我想将一个共享库注入一个进程(我ptrace()用来做那部分),然后能够将共享库的输出返回到我正在使用某种形式的 IPC 编写的调试器中。我的直觉是使用管道,但唯一真正的要求是:

  • 我不想在文件系统上存储任何东西来促进通信,因为它只会在调试器运行时持续。
  • 我想要一个可移植的 Unix 解决方案(因此 Unix 标准的系统调用将是理想的)。

我遇到的问题是,据我所知,如果我pipe()在调试器中调用,则无法将管道的“发送”端传递给目标进程,反之亦然。我可以设置共享内存,但我认为这需要在某个地方创建一个文件,以便我可以从两个进程中引用内存段。其他调试器在附加到已经开始运行的进程时如何捕获输出?

4

2 回答 2

0

我假设您需要一个调试系统来调试您的业务逻辑代码(我的意思是应用程序)。根据我的经验,这种问题可以通过下面解释的系统设计来解决。(我的经验是使用 C++,我认为同样适用于基于 C 的系统。)

  1. 有一个记录系统(一个单独的进程)。这将包含 - 记录器管理器和记录代码 - 负责将日志转储到硬盘中。
  2. 每个应用程序实例(在 Unix 中运行的进程)都将通过套接字与该进程通信。因此,您可以拥有自己的消息传递协议,并通过基于套接字的通信与记录器系统进行通信。
  3. 稍后,对于每个此应用程序 - 有一个可以关闭/打开日志的开关。这样您就可以拥有一个工具 - 向该进程发送信号以打开/关闭消息记录。

在高层次上,这是开发日志系统最通用的方法。如果您需要任何信息 - 请发表评论。我会尽力回答。

于 2013-06-24T06:51:15.297 回答
0

使用更好的搜索词向我展示了这个问题是这些人的重复:

最重要的答案是我正在寻找的。您可以使用 Unix 域套接字将文件描述符交给不同的进程。这可以从调试器到库,反之亦然,但从调试器到库可能更容易做到,因为调试器可以在注入库时将套接字的地址写入目标进程。

但是,一旦我将套接字的地址传递给目标进程,我还不如只使用套接字本身而不是另外使用管道。

于 2013-06-24T07:05:35.263 回答