Ruby - set_trace_func 在分叉进程上

Ruby - set_trace_func on forked processes

我想实现以下目标:

构建一个 Ruby 命令行实用程序来注册一些 set_trace_func 事件,然后调用您传递给它的任何 ruby-可执行参数(比如 rspec)。注册的事件然后转移到调用的命令。

myutility的伪代码:

set_trace_func() # Set some events here

exec(ARGV.join(' ')) # Execute argument passed

然后调用 myutility rspec.

我这里的objective实际上是在任意命令上注册跟踪点(只要它们使用ruby垫片)。

我尝试过的事情:

  1. exec 不起作用,原因很明显(它完全取代了过程)。
  2. popen,系统,反引号。这些启动一个独立的进程。

我可以使用某种形式的 IPC,但这假定控制我使用我的实用程序调用的命令。不是这种情况;我想接受任意 Ruby- 可执行参数。

这可能吗?我没有仔细研究过的一件事是 drb,但这也假设了对外部参数的一些干扰。

您可以通过向 ruby 解释器添加参数将一些代码注入 ruby 进程,因此您的实用程序可以分为两部分 - 运行ner 和 payload。 Payload 只是另一个脚本,它根据需要注册 set_trace_func 等,运行ner 将前者注入目标脚本,如下所示:

exec('/usr/bin/env', 'ruby', '-r', payload_full_filename, *ARGV)

这将使 ruby 到 require 您的有效负载首先进入进程,然后继续 运行ning 目标脚本本身(即使目标脚本不能,有效负载也会 运行编译)