我正在寻找方法来查看当前正在执行的代码。我的理由是:我有红宝石类,是猴子修补了很多补丁,所以它几乎不可能跟踪哪些方法被改变。是否有任何方法检查哪些代码已加载到内存中并正在执行?
如果你需要的话,询问更多的细节
发布于 2015-02-05 12:23:23
一种方法的起源
在ruby1.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]现在,方法的位置在语句2的控制台(pry)中,这是可行的,因为我的修补程序创建了一个新的方法-对象,它取代了User类的方法字典中的旧方法。新方法对象返回不同的source_location。
发布于 2015-02-05 12:34:15
除了tessi提到的调试器之外,另一种方法是使用ruby-prof对整个应用程序进行基准测试,并分析生成的树。
每个被调用的方法都在其中,因此所需的或不需要的版本也在其中。
https://stackoverflow.com/questions/28343445
复制相似问题