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

Tom*_*aps 34 ruby ide debugging

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

Pet*_*own 42

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

  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调试器命令逐行移动.

*知道断点的位置可以理解代码,但是你应该从lib/gemname.rb开始

  • 谢谢.这非常有效.FWIW,我在[Pry](https://rubygems.org/gems/pry)中使用这些说明而不是ruby-debug,这也很有用. (3认同)
  • 只要您导出编辑器,您就可以通过简单地调用“bundle openrails”来组合步骤 2 和 3。确保您的 .bash_profile 中有 `export EDITOR='subl -w'` (或您正在使用的任何编辑器)。 (3认同)
  • 专业提示 - 完成后使用“bundle pristine”将所有宝石恢复到缓存的原始状态。 (3认同)

Chr*_*eck 12

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

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

  • 是.这就是重点.除非你没有选择,否则我会避免不惜一切代价编辑Gem文件,除非你愿意分叉 (2认同)