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.