在ruby中调试第三方gem的最佳方法

时间:2011-12-17 14:58:08

标签: ruby debugging ide

由于ruby gem中可能有很多 Ghost Methods ,我认为仅仅通过静态读取源代码来研究ruby gem的内部机制并不是一个好主意。有没有办法将第三方gem的源文件附加到正在运行的ruby进程进行调试,以便我可以设置断点并查看事情是如何动态工作的? 顺便说一句,我试图通过点击'require'语句的上下文菜单“Go To-> Implementations”或第三方gem的其他符号来导航到RubyMine中第三方gem的源文件(例如require 'watir',但没有成功。对于像Ruby这样的动态类型语言的IDE来说,符号导航失败是否正常?

6 个答案:

答案 0 :(得分:41)

我很想知道是否有更好的方法可以做到这一点,但我通常如何做到:

  1. 将ruby-debug gem添加到您的Gemfile(如果您使用的是Ruby 1.9.2,则使用ruby-debug19)
  2. 通过bundle show gemname找到宝石。我在Mac上,所以我通常把它管道到pbcopy,所以它被复制到我的剪贴板。 bundle show rails | pbcopy
  3. 在您喜欢的编辑器中打开gem目录。 mvim /path/to/gem/directory
  4. 导航到要放置断点*的文件和行,并在相关行上方插入debugger
  5. 重新加载页面,运行测试或执行任何您要执行的Gem文件
  6. 当执行在调试器停止时,您可以检查变量(p variable_name),并逐行移动ruby debugger commands
  7. *知道断点的位置可以理解代码,但是你应该从lib / gemname.rb开始

答案 1 :(得分:12)

我会避免按照当前接受的答案中的建议编辑Gem文件。而是将debugger命令放在一个app文件中,并使用break命令在gem中设置断点。我正在使用rvmgemset,所以我就是这样做的:

break /Users/chris/.rvm/gems/ruby-1.9.3-p125@<gemset>/gems/<gem_name>-<gem-version>/<path_to_file>:<line_number>

答案 2 :(得分:1)

这两个命令都将输出一条路径到您计算机中的gem源。

# if it is present in your gemfile
bundle show gemname

# if not in your gemfile
gem which gemname

然后只需在您选择的文本编辑器中打开文件夹,并进行良好的调试即可!

答案 3 :(得分:0)

在运行时更改代码的语言(如Ruby)很难准确预测符号,方法等的起源100%。

我处理了许多需要源代码分析的第三方宝石,我发现这个任务的最佳工具是Netbeas +它的Ruby和Rails插件。

  • 允许依赖宝石源代码中的良好导航(与其他替代方案不同)
  • 实际工作的可视断点和调试(带跟踪和所有)**

**它在产生的代码块中有一些方法调用的故障(比如每个{})但是我学会了处理那些

我通常做的是设置断点并在运行时分析代码。

答案 4 :(得分:0)

pry宝石对我有用。

bundle add pry --group "development, test"

在使用pry的.rb文件中,您必须要求binding.pry

require 'pry'

这里是GitHub link

答案 5 :(得分:0)

如果您使用的是Visual Studio代码,并且拥有normal debugging enabled for rails,则可以在VS Code中打开要调试的gem文件,例如:

model.objects.annotate(position_wgs84=Transform('position', 4326))

并使用VSCode设置断点。它将在该行停止执行。