set_trace_func

set_trace_funcを使ってProcオブジェクトを登録すると、インタプリタの動きにあわせてそのオブジェクトが呼び出されます。

set_trace_func proc { |event, file, line, id, binding, klass|
    print "#{event}, #{file}, #{line}, #{id}, #{binding}, #{klass}\n"
}

class Rubyco
  def self.singleton_method_added(sym)
    puts "singleton_method_added(#{sym})"
  end
  def self.singleton_method_removed(sym)
    puts "singleton_method_removed(#{sym})"
  end
end

実行結果です。

line, a.rb, 5, , #<Binding:0x298e840>, false
c-call, a.rb, 5, inherited, #<Binding:0x298e768>, Class
c-return, a.rb, 5, inherited, #<Binding:0x298e648>, Class
class, a.rb, 5, , #<Binding:0x298e510>, false
line, a.rb, 6, , #<Binding:0x298e408>, false
call, a.rb, 6, singleton_method_added, #<Binding:0x298e2d0>, Rubyco
line, a.rb, 7, singleton_method_added, #<Binding:0x298e1c8>, Rubyco
c-call, a.rb, 7, to_s, #<Binding:0x298e0c0>, Symbol
c-return, a.rb, 7, to_s, #<Binding:0x298dfb8>, Symbol
c-call, a.rb, 7, puts, #<Binding:0x298de98>, Kernel
c-call, a.rb, 7, write, #<Binding:0x298df58>, IO
singleton_method_added(singleton_method_added)c-return, a.rb, 7, write, #<Binding:0x298de50>, IO
c-call, a.rb, 7, write, #<Binding:0x298dd60>, IO

c-return, a.rb, 7, write, #<Binding:0x298dc40>, IO
c-return, a.rb, 7, puts, #<Binding:0x298db38>, Kernel
return, a.rb, 8, singleton_method_added, #<Binding:0x298da48>, Rubyco
line, a.rb, 9, , #<Binding:0x298d958>, false
call, a.rb, 6, singleton_method_added, #<Binding:0x298d670>, Rubyco
line, a.rb, 7, singleton_method_added, #<Binding:0x298d580>, Rubyco
c-call, a.rb, 7, to_s, #<Binding:0x298d460>, Symbol
c-return, a.rb, 7, to_s, #<Binding:0x298d358>, Symbol
c-call, a.rb, 7, puts, #<Binding:0x298d268>, Kernel
c-call, a.rb, 7, write, #<Binding:0x298d2f8>, IO
singleton_method_added(singleton_method_removed)c-return, a.rb, 7, write, #<Binding:0x298d208>, IO
c-call, a.rb, 7, write, #<Binding:0x298d118>, IO

c-return, a.rb, 7, write, #<Binding:0x298d028>, IO
c-return, a.rb, 7, puts, #<Binding:0x298cf20>, Kernel
return, a.rb, 8, singleton_method_added, #<Binding:0x298ce30>, Rubyco
end, a.rb, 5, , , false

これを使うと、デバッガが作れそうですね♪……って、デバッガはこれを使って作っているのだそうです。