debugging 如何在unicorn_rails上使用ruby-debug-ide?

pnwntuvh  于 2022-12-13  发布在  Ruby
关注(0)|答案(1)|浏览(259)

我想使用VScode作为Ruby on Rails的集成调试器。关于如何做到这一点,似乎有很好的指南,无论是在VScode中启动进程还是连接到正在运行的调试服务器。
但是,我 * 找不到 * 好的指南来指导运行unicorn时如何执行此操作。
rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 1234 -- ./bin/rails s
它需要bin/rails s来启动rails服务器。这是我们目前用来启动unicorn的命令:
bundle exec unicorn_rails -E "develop_against_staging" -p 3010 -c "${PWD}/config/unicorn.rb"
有没有一种方法可以从Rails中启动unicorn?或者有没有其他方法可以告诉rdebug-ide该做什么?我甚至找不到关于rdebug-ide的好文档。如果我找到了什么,我会继续摆弄并自己回答这个问题。

wztqucjr

wztqucjr1#

  • 首先需要安装Ruby extension
  • 在宝石文件中添加以下宝石:
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文件以查看所有可用的选项。
--调度程序端口:这是一个相同的端口,你将用来运行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按钮开始调试。
现在,您的unicorn服务器已经启动,如果您尝试访问您的应用程序,您将无法访问它,因为工作进程尚未启动。
继续仔细查看日志,您会注意到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文件中将工作线程数设置为一个,您应该看到类似于. I, [2022-07-13T19:44:26.914412 #122] INFO -- : worker=0 ready的日志。现在设置一个断点并开始使用您的应用程序,它将在到达该代码路径时中断。
如果你已经成功地设置了一切,并得到了这一点,将有一些gotcha,你可能需要处理。

  • 工作进程超时
  • 正在使用不同的随机端口重新链接到子调试器。
  • ...

这种复杂性是因为独角兽的主仆设计。
回答这个有点匆忙,请让我知道,如果你有任何问题。我道歉,如果我使这个更多的混乱给你。

相关问题