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
相关产品推荐
相关产品推荐

