【问题标题】:Ruby - set_trace_func on forked processesRuby - 分叉进程上的 set_trace_func
【发布时间】:2015-12-09 14:31:43
【问题描述】:

我想实现以下目标:

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

myutility的伪代码:

set_trace_func() # Set some events here

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

然后调用myutility rspec

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

我尝试过的事情:

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

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

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

【问题讨论】:

    标签: ruby ipc trace


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了。我正在从命令行执行 ruby​​ -r ;不知道 exec 允许这样做。这是正确的答案。一个快速跟进的问题:如何使用本身调用 ruby​​ 的命令来完成这项工作?像 rspec。就目前而言,它通过一个错误说它自然找不到 rspec。
    • 我记得 - rspec 默认情况下不调用 ruby​​,但可以在 drb 上工作,您也可以运行spring-ed 可执行文件
    • 至于“未找到”错误 - 因为在没有 shell 的情况下运行,您必须自己解析脚本完整路径(或通过传递给 which before/in runner)
    • 您说“[rspec] 可以在 drb 上工作”,您的意思是什么?当我无权访问客户端代码时,如何让客户端(我传递给脚本的命令)在 drb 上工作?
    • a 意味着 rspec 可以(并且在大型项目中可能)与 spork (github.com/sporkrb/spork) 一起使用,它通过预加载内容和分叉来加速测试启动,它可以在 drb 上运行,并且可能对您的工具来说是个问题,因为繁重的工作是在其他过程中完成的
    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2011-06-24
    • 2017-05-12
    • 2018-10-23
    相关资源
    最近更新 更多