You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails项目VSCode远程调试断点不触发如何解决?

问题根因

Unicorn 采用 Master-Worker 多进程架构,你当前仅将调试器附加到了执行 rdebug-ide 启动命令的 Master 进程,实际处理 HTTP 请求的是 Master 进程后续 fork 出来的 Worker 子进程,子进程并未和 VSCode 调试器建立有效通信连接,因此断点无法触发。

解决步骤

1. 修改Unicorn配置

编辑项目下的 config/unicorn.rb 文件,调整如下配置:

# 调试阶段仅保留1个Worker进程,避免多Worker导致的调试连接混乱
worker_processes 1
# 关闭代码预加载,避免fork后子进程丢失调试器连接
preload_app false

如果你的项目必须开启 preload_app,可以在配置文件中增加 after_fork 钩子,子进程启动时自动重建调试连接:

after_fork do |server, worker|
  # 仅开发调试阶段生效
  if ENV['IDE_DEBUG']
    require 'ruby-debug-ide'
    Debugger.interface = Debugger::LocalInterface.new
    Debugger.start_server('0.0.0.0', 1234 + worker.nr + 1)
  end
end

2. 调整rdebug-ide启动命令

增加 --dispatcher-port 参数用于支持子进程和调试器通信,启动命令修改为:

rdebug-ide --debug --host 0.0.0.0 --port 1234 --dispatcher-port 26162 -- bin/rails s -p 3000 -b 0.0.0.0

3. 更新VSCode launch.json配置

增加 debugPort 字段匹配上面的dispatcher端口:

"configurations": [
    {
      "name": "Listen for rdebug-ide",
      "type": "Ruby",
      "request": "attach",
      "cwd": "${workspaceRoot}",
      "remoteHost": "127.0.0.1",
      "remotePort": "1234",
      "remoteWorkspaceRoot": "/home/my-app",
      "showDebuggerOutput": true,
      "debugPort": "26162"
    }
]

4. 确认Vagrant端口映射

检查Vagrantfile配置,确保1234、26162、3000端口都已经暴露并映射到宿主机对应端口。

临时调试备选方案

如果当前调试场景不要求必须使用Unicorn,可以临时切换为单进程的WEBrick服务器验证调试逻辑,规避多进程问题:

rdebug-ide --debug --host 0.0.0.0 --port 1234 -- bin/rails s webrick -p 3000 -b 0.0.0.0

其他注意事项

完成上述配置后重启服务和调试器即可正常命中断点。如果仍未生效,可尝试将debase版本升级到0.2.4稳定版,避免beta版本的兼容性bug。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:45:03