poor man's rubyのデバッグを始めた

RushCheckを使っての、poor man's rubyデバッグを始めました。
デバッグしたいのはRubyの処理系なので、RushCheckをpoor man's rubyで動かすわけには行きません。そこで、普通のrubyでRushCheckを動かして、パイプでpoor man's rubyのテストプログラムを流し込むようにしました。
でも、これはWindowsXP + Cygwinではデッドロックしてしまいます。

popenを使った版、普通のrubyで動かすが、うまく動かない。

require 'rubygems'
require 'rushcheck'

EPSILON = 1e-5
pp = IO.popen("c:/cygwin/usr/local/bin/static-ruby.exe agent.rb", "r+")

rc = RushCheck::Assertion.new(Float, Float)do |a, b|
  print "#{a} + #{b} \n"
  STDOUT.flush
  pp.puts "(#{a} + #{b})"
  pp.flush
  pp.puts "#CHECK-IT"
  pp.flush
  out = ""
  while /^\s+$/ !~ (cur = pp.readline) do
    out += cur
  end
  answer = eval("(#{a} + #{b})")
  (out.to_f - answer).abs < (EPSILON)
end
rc.check
pp.puts "#CHECK-END"
pp.close

poor man's rubyで動かすプログラム(agent.rb)。#CHECK-ITという行を送ると、今まで送った文字列を評価して、結果を標準出力に返す。

lins = ""
while true do 
  case lin = readline
  when /^#CHECK-IT/
    print eval(lins)
    print "\n"
    STDOUT.flush
    print "\n"
    STDOUT.flush
    lins = ""
  when /^#CHECK-END/
    exit(0)
  else
    if lin then
      lins += lin
    else
      exit(0)
    end
  end
end

そこで、ソケットを使って同じようなことをしようと考えています。ところが、require "socket"を実行すると、シンボルをinternするところでSEGVしてしまいました。Floatと関係が薄いところなので、メモリ管理がらみの可能性が大です。茨の道は長そうです。