gem 'debase'
gem 'ruby-debug-base', :platforms => [:jruby, :ruby_18, :mingw_18]
gem 'ruby-debug-base19x', '>= 0.11.30.pre4', :platforms => [:ruby_19, :mingw_19]
gem 'ruby-debug-ide' , "~>0.6.1"
然后,您需要通过提供 --dispatcher-port 选项让 rdebug-ide 知道您正在使用 unicorn(多进程应用程序)。请查看rdebug-ide 文件以查看所有可用选项。
--dispatcher-port:这是您将用于运行 unicorn 的相同端口。在你的情况下3010。
所以它应该是这样的:
bundle exec rdebug-ide --debug --port 1234 --dispatcher-port 3010 -- vendor/bundle/ruby/2.6.0/bin/unicorn -E "develop_against_staging" -p 3010 -c "${PWD}/config/unicorn.rb
单独运行上面的命令不会启动调试,事实上你的 Unicorn 服务器还不会启动。在终端窗口中运行上述命令后查看日志时,您会注意到类似这样的消息
Fast Debugger (ruby-debug-ide 0.6.1, debase 0.2.4.1, file filtering is supported) listens on 127.0.0.1:1234
日志告诉我们 rdebug-ide 已准备好连接到端口 1234。创建一个 launch.json 文件(如果尚未创建)并添加此配置。
{
"version": "0.2.0",
"configurations": [
{
"name": "1234 Listen for rdebug-ide",
"type": "Ruby",
"request": "attach",
"remoteHost": "127.0.0.1",
"remotePort": "1234",
"remoteWorkspaceRoot": "${workspaceRoot}",
"cwd": "${workspaceRoot}"
}
]
}
添加条目后,继续并单击PlayImage here按钮开始调试。
现在您的独角兽服务器已经启动,如果您尝试访问您的应用程序,您将无法访问它,因为工作进程尚未启动。
继续仔细查看日志你会发现
122: Ide process dispatcher notified about sub-debugger which listens on 34865。这告诉我们在端口34865 上启动了一个新的子调试进程。这是一个随机生成的端口find_free_port。
注意:每个 unicorn-worker 将有一个端口。
看到上面的日志后,将另一个条目添加到 launch.json 文件中,并将新生成的端口复制到文件中。像这样
{
"version": "0.2.0",
"configurations": [
{
"name": "1234 Listen for rdebug-ide",
"type": "Ruby",
"request": "attach",
"remoteHost": "127.0.0.1",
"remotePort": "1234",
"remoteWorkspaceRoot": "${workspaceRoot}",
"cwd": "${workspaceRoot}"
},
{
"name": "34865 Listen for sub-rdebug-ide",
"type": "Ruby",
"request": "attach",
"remoteHost": "127.0.0.1",
"remotePort": "34865",
"remoteWorkspaceRoot": "${workspaceRoot}",
"cwd": "${workspaceRoot}"
}
]
}
添加后,选择新配置并单击播放按钮。如果您在 unicorn.config 文件中将 worker 数量设置为一个,您应该会看到类似这样的日志。
I, [2022-07-13T19:44:26.914412 #122] INFO -- : worker=0 ready。现在放置一个断点并开始使用您的应用程序,一旦到达该代码路径,它就会中断。
如果您已成功设置所有内容并达到这一点,您可能需要处理一些问题。
- 工人超时
- 重新链接到具有不同随机端口的子调试器。
- ...
这种复杂性是因为独角兽主工设计。
回答的有点仓促,有问题可以私信我。如果我让您更加困惑,我深表歉意。