如何将Rubymine IDE调试器附加到shell进程?

12

我想使用Rubymine的IDE调试器来调试在命令行中运行的Ruby进程,例如通过"rails console"启动的进程。

当在Rubymine中运行Web服务器或测试套件时(也是从Rubymine中运行),我已经充分利用了调试器。

然而,如果进程不是由Rubymine启动,我不知道如何附加调试器。

我正在使用Ubuntu上的Rubymine 3.2.4版本,Sun Java 1.6.0_26,Ruby REE 1.8.7和最新的调试宝石(debug gems)。

ruby-debug-base (0.10.4)
ruby-debug-ide (0.4.17.beta8)

你觉得呢?


1
我认为你的问题标题缺少一个动词。 - David Grayson
3个回答

8
请使用RubyMine中的Ruby远程调试配置类型。有关详细信息,请参阅官方RubyMine文档
基本上,您可以像这样运行脚本:
rdebug-ide --port <port number> -- script.rb

然后从RubyMine调试器连接到指定的端口。


谢谢@CrazyCoder,这个方法很有效,在我稍微排除困惑之后:1.在命令行启动rdebug-ide命令,例如,要调试一个rails console shell会话,它将读取:rdebug-ide --port 1234 -- rails console。2.在RubyMine中,使用运行配置编辑器并使用相同的端口(这里是1234)和远程路径设置为工作目录创建一个新的Ruby Remote Debug配置,然后单击调试按钮,它将导致shell初始化,同时源代码可以在RubyMine中断点调试。非常感谢! - Wolfram Arnold

7
这是在Rails中的操作方法:
首先,确保您已安装了rdebug-ide:
gem install ruby-debug-ide --platform=ruby

接下来,在控制台中运行以下代码:

rdebug-ide --port 6778 -- /projects/your_rails_project/script/rails console

或者适用于Rails 4.0+
rdebug-ide --port 6778 -- /projects/your_rails_project/bin/rails console

或者,正如@ChristopherWill提到的以下, 如果您想调试非本地服务器,则可以传递一个--host参数。(请阅读他下面的评论以获取注意事项)

这将等待远程调试客户端连接。

  1. 在RubyMine中单击运行>编辑配置,然后添加“Ruby Remote Debug”实例

  2. 使用与上面相同的端口6778(如果更改上面的端口,请确保端口匹配)

  3. 根文件夹和本地根文件夹是相同的,/projects/your_rails_project

  4. 单击应用并关闭。

接下来,在运行和调试按钮旁边的列表中选择此配置,然后单击调试按钮。等待几秒钟,控制台将在您运行“rdebug-ide”的任何位置运行“rails console”


我目前正在使用RubyMine 4.0.3调试一个Rails 3.2.2应用程序(ruby 1.9.3p194)。当我尝试使用rdebug-ide运行“boot.rb”时,进程启动并立即停止。但是,当我使用上面的命令时,它对我起作用了。 - Abdo
你可以轻松地运行该进程,但我认为你无法在断点处停止它,因为rails可执行文件会生成一个未被监控的后台进程。而我最初使用调试器运行它的原因是要设置断点。http://youtrack.jetbrains.com/issue/RUBY-10967 - Wolfram Arnold
我的程序在断点处停止,一切都按预期工作。这可能是因为我在development.rb中有这段代码吗?silence_warnings do begin require 'pry' Rails::Console::IRB = Pry rescue LoadError rescue end end - Abdo
太棒了。在无数个小时的挣扎后,我终于通过IntelliJ(Ruby 4.0.3.20120406)、ruby-debug-ide 0.4.17.beta9和ruby-debug-base 0.11成功实现了远程调试。 它运行得非常顺畅。 但是,有没有人知道如何调试通过浏览器访问的应用程序(而不直接指定任何脚本作为rdebug-ide参数)? - Christopher Will
@Christopher 你是指网络应用程序吗?如果是的话,这很容易!如果这是第一次,在“运行”>“编辑配置”中,点击Rails然后点击+按钮。您可能会遇到SDK的问题,因此请选择在运行rails server时使用的SDK。单击应用后,下次单击调试时,它将使用此配置(假设它是唯一的)。如果您有其他配置,则可以单击下拉菜单并选择新创建的配置。=)如果我上面的答案有帮助,请确保点赞它! :-) - Abdo
显示剩余4条评论

3

我真的想在这里发布一些很难找到完整答案的内容,而且我花了很长时间才弄清楚。有人问如何将远程调试附加到resque worker上,这是最终为我工作的正确方法。这篇文章在谷歌搜索中排名靠前,很容易找到。

从服务器的Shell(对我来说是我的笔记本电脑)执行以下操作:

rdebug-ide --port 1236 --dispatcher-port 26166 --host 0.0.0.0 bin/rake resque:work QUEUE=*

在RubyMine IDE中配置远程调试:

远程主机:127.0.0.1

远程端口:1236

远程根目录:站点根目录的服务器路径

本地端口:26166

本地根路径:您设置断点的根文件所在的工作站路径(在我的情况下,它都是本地的,因此所有文件都在一个路径和一个副本中)

像往常一样运行您的Web服务器:rails s

在Resque worker中设置断点,并尝试执行您需要在站点中执行的任何操作,以使您达到该断点。

注意1-使用"spring" gem会导致错误,我不得不将其注释掉/捆绑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接