三浦と申します

set_trace_funcを引っ掛けるのはタイムアウトしてからでいいんじゃないかな?
と思い作ってみました。

#!/usr/bin/ruby
require "pp"
def recursive(n=100)
   if n>0
      rec2(n-1)
   end
end

def rec2(n)
   recursive(n)
end

Thread.new do
  sleep(1)
  tf = lambda do |event, file, line, id, binding, klass|
    Thread.current[:bs] = binding
  end
  while Thread.list.any?{|n| n.status == "run" and n[:bs].nil? } do
    set_trace_func(tf)
    Thread.pass
    set_trace_func(nil)
  end

  Thread.list.each do |th|
    p th
    if th[:bs] then
      puts eval("caller", th[:bs])
    end
    print "\n"
  end

  Thread.main.raise("END")
end

loop do
   recursive
end