【问题标题】:How to use ruby-debug-ide with unicorn_rails?如何将 ruby​​-debug-ide 与 unicorn_rails 一起使用?
【发布时间】:2022-12-11 05:25:25
【问题描述】:

我想将 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 服务器。这是我们目前用来启动独角兽的命令:

bundle exec unicorn_rails -E "develop_against_staging" -p 3010 -c "${PWD}/config/unicorn.rb"

有没有办法从 Rails 中启动独角兽?还是有另一种方式告诉rdebug-ide该做什么?我什至找不到 rdebug-ide 的好文档。如果我弄清楚了,我会继续摆弄并自己回答这个问题。

【问题讨论】:

    标签: ruby-on-rails debugging visual-studio-code unicorn


    【解决方案1】:
    • 首先你需要安装Ruby extension

    • 在您的 Gemfile 中添加以下 gem:

    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。现在放置一个断点并开始使用您的应用程序,一旦到达该代码路径,它就会中断。

    如果您已成功设置所有内容并达到这一点,您可能需要处理一些问题。

    • 工人超时
    • 重新链接到具有不同随机端口的子调试器。
    • ...

    这种复杂性是因为独角兽主工设计。

    回答的有点仓促,有问题可以私信我。如果我让您更加困惑,我深表歉意。

    【讨论】:

    • 我没有时间测试这个atm,但是非常感谢你的回答!如果我有任何问题,我会在这里发表评论。
    • 我能够让其中的一些工作正常,但它从未说过sub-debugger which listens on <PORT>。它直接转到master process ready, worker=0 ready, worker=1 ready,但我的前端无法连接到它。我尝试同时使用 unicornunicorn_rails 可执行文件并尝试确保所有辅助服务都在运行,但我可能错过了一些东西。
    • 您能否确认以下内容:``` * 您使用的是 0.6.1 版本的 ruby​​-debug-ide * 您还可以粘贴您运行的启动独角兽的命令``` 我建议先使用一个工人。一旦你了解它是如何工作的,你就可以增加工人的数量。
    • 从 ruby​​-debug-ide 0.7.3 降级到 0.6.1,并修复了它!太感谢了!
    • 太棒了,如果你想使用 0.7.3,请查看我在GitHub 中报告的错误。此外,一旦您选择使用 0.7.3,然后查看此选项skip_wait_for_start,这将进一步简化调试。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多