目前执行代码

时间:2015-02-05 12:01:06

标签: ruby-on-rails ruby

我正在寻找方法来查看当前正在执行的代码。我的理由是:我有ruby类,这些类是由许多补丁修补的猴子,因此几乎无法跟踪哪些方法被更改。有没有办法检查哪些代码已加载到内存中并且当前正在执行?

如果需要,请询问更多详情

2 个答案:

答案 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