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と関係が薄いところなので、メモリ管理がらみの可能性が大です。茨の道は長そうです。