我正在寻找方法来查看当前正在执行的代码。我的理由是:我有ruby类,这些类是由许多补丁修补的猴子,因此几乎无法跟踪哪些方法被更改。有没有办法检查哪些代码已加载到内存中并且当前正在执行?
如果需要,请询问更多详情
答案 0 :(得分:2)
除了tessi提到的调试器之外,另一种方法是使用ruby-prof
对整个应用程序进行基准测试并分析生成的树。
每个被调用的方法都在那里,所以也是所需的版本。
答案 1 :(得分:1)
在ruby 1.9及更新版本中,您可以随时打开调试器/控制台,并询问方法的源位置。
例如,在查找admin?
类的User
方法的定义时,我可以执行以下操作:
user = User.first
=> #<User id: 1, ...>
user.method(:admin?).source_location
=> ["/Users/tessi/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activemodel-4.0.13/lib/active_model/attribute_methods.rb", 382]
它告诉我admin?
方法在ActiveModel中定义在上面的文件中以及该文件的第382行。
以类似的方式,您可以遍历类的所有方法并检查方法的来源:
user.methods.map {|method_name| user.method(method_name).source_location}
这仍适用于修补课程。打开rails控制台时,我可以编辑User
课程并再次查看source_location
:
class User < ActiveRecord::Base
def admin?
puts 'the patched admin? method'
super
end
end
User.first.method(:admin?).source_location
=> ["(pry)",2]
现在,方法的位置在我的控制台(pry)中,位于语句2.这是有效的,因为我的补丁创建了一个新的Method-object,它取代了{{1}的方法字典中的旧方法}类。新方法对象返回不同的User
。