由于ruby gem中可能有很多 Ghost Methods ,我认为仅仅通过静态读取源代码来研究ruby gem的内部机制并不是一个好主意。有没有办法将第三方gem的源文件附加到正在运行的ruby进程进行调试,以便我可以设置断点并查看事情是如何动态工作的?
顺便说一句,我试图通过点击'require'语句的上下文菜单“Go To-> Implementations”或第三方gem的其他符号来导航到RubyMine中第三方gem的源文件(例如require 'watir'
,但没有成功。对于像Ruby这样的动态类型语言的IDE来说,符号导航失败是否正常?
答案 0 :(得分:41)
我很想知道是否有更好的方法可以做到这一点,但我通常如何做到:
bundle show gemname
找到宝石。我在Mac上,所以我通常把它管道到pbcopy,所以它被复制到我的剪贴板。 bundle show rails | pbcopy
mvim /path/to/gem/directory
debugger
。p variable_name
),并逐行移动ruby debugger commands。*知道断点的位置可以理解代码,但是你应该从lib / gemname.rb开始
答案 1 :(得分: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>
答案 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设置断点。它将在该行停止执行。