Hi all.

Problem
-------
Sometimes profiling of large library gives me results like:

  %   cumulative   self              self     total 
time   seconds   seconds    calls  ms/call  ms/call  name 
...
10.60     2.20      0.38      210     1.81     6.45  Kernel.instance_eval
...

And I have a question "who had called Kernel#instance_eval so many times?"

Solution
--------
class Module
  def add_tracer(meth)
    m_alias = case meth 
      when :[] : "old_idx" 
      when :+ : "old_plus" 
      when :- : "old_minus" 
      #and so on
      else ; "old_#{meth}"
    end
    module_eval %Q{
      alias :#{m_alias} :#{meth}
      def #{meth}(*arg, &block)
        puts caller[0] + ": " + self.class.name + "##{meth} called"
        #{m_alias}(*arg, &block)
      end
    }
  end
end

Usage
-----
Kernel.add_tracer(:instance_eval)
call_my_long_routine()

Which gives me desired information:
....
D:/tmp/test.rb:11:in `call_my_long_routine': Object#instance_eval called
....

Isn't it cool? :)
Seriously, I think my solution has many drawbacks, but it helps me.
Maybe it will help somebody else.

Victor.