$global_trace_mutex = Mutex.new class Thread alias :old_initialize :initialize def initialize(*args, &proc) callingClass = eval("self.class", proc.binding) callingClassID = eval("self.object_id", proc.binding) new_proc = proc do |*args, &block| $global_trace_mutex.synchronize do $stderr.puts "new_thread: #{callingClass}_#{callingClassID} thread_#{Thread.current.object_id}" end proc.call(*args, &block) end old_initialize(*args, &new_proc) end end set_trace_func proc { |event, file, line, id, binding, classname| if ["call","return"].include?(event) and not ["Thread","Mutex", "Kernel"].include?(classname.to_s) object_id=eval("self.object_id", binding) thread_id=eval("Thread.current.object_id", binding) $global_trace_mutex.synchronize do $stderr.puts "#{event}: " + classname.to_s + "_#{object_id}." + id.to_s + " thread_#{thread_id}" end end }