调试器:在进程 <pid1> fork 后附加到子进程 <pid2>

stw*_*667 5 ruby debugging ruby-on-rails zeus

当使用 ruby​​ debug gem时,我经常看到打印出以下输出:

DEBUGGER: Attaching after process <pid1> fork to child process <pid2>
Run Code Online (Sandbox Code Playgroud)

其中<pid1>是父进程 ID(如 12345),<pid2>是新分叉的子进程 ID(如 55555)。

这里发生了什么?它与连接到SpringZeus等应用程序预加载器有什么关系吗?

stw*_*667 6

它来自这里的代码: https://github.com/ruby/debug/blob/4af8c25140a7a672db852954b6a1733b3169b608/lib/debug/session.rb#L2129-L2162

发生的情况是,您的主 Ruby 进程正在分叉一个新进程,并且它告诉您调试器正在附加到新创建的具有进程 id 的子进程<pid2>,以便它也可以因调试事件而中断。

就我而言,这是在调用visit <url>自动​​化测试时发生的,由于有 Capybara Selenium Webdriver,该测试创建了一个新的子进程来启动 Chrome 进程以呈现请求的 HTML。

默认情况下,ruby调试 gem将附加到进程和子进程。但是您可以使用环境变量进行覆盖,仅激活子级或父级的调试器RUBY_DEBUG_FORK_MODE

需要明确的是,它与 Spring 或 Zeus 等应用程序预加载器无关。