From: Victor Shepelev Date: 2006-05-11T07:45:28+09:00 Subject: Module#add_tracer 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.