なひです.

> From: kikutani / sprintmail.com [mailto:kikutani / sprintmail.com]
> Sent: Sunday, August 01, 1999 8:19 PM

> > > 私が前回「原理的には簡単なんだが」と発言したときのアイディア
> > > は以下の通りです。
> > > 
> > >   debug.rbを改造して
> > > 
> > >     + UNIX domain socketを作り、そこからコマンド入出力を行う。
> > > 
> > >     + UNIX domain socketに対する双方向入出力をするプログラム
> > >       をdebugcomm.rbとすると、kterm -e ruby debugcomm.rb <path>&
> > >       で入出力用ウィンドウを開く。

昨日行った本屋には入門Perlが置いてなかったのでした.
未だによくわかっていないかもしれません...^^;

> > なるほど。ありがとうございます。
> > でも、ソケットって使ったことないんだよな...
> 
> やってみました。意外に簡単でした。
> UNIXsocket/UNIXserver の使用例が全然ないので最初だけハマったけど。
> 
> やったことは、debug.rb を sdebug.rb にコピーし、
> 
> class DEBUGGER__
>   def initialize
>     ...
>     ...
>     @debug_socket = "/tmp/ruby-debug"
>     @debug_port = UNIXsocket.new(@debug_socket)
>   end
> 
> とし、あとはSTDINとSTDOUTを@debug_portにリプレースしただけ。
> 
> べつのrxvtでは以下のものを走らせている。
> 
> require "socket"
> debug_socket = "/tmp/ruby-debug"
> if FileTest.exist?(debug_socket)
>   File.unlink debug_socket
> end
> us = UNIXserver.open(debug_socket)
> port = us.accept
> 
> $reader = Thread.new do
>   while true
>     s  = port.gets
>     printf "> %s", s
>     STDOUT.flush
>   end
> end
> 
> while true
>   s = STDIN.gets
>   printf(port, "%s", s)
> end

なるほどこういう手を使うのですね...この場合sdebug.rbが,
まつもとさんの「debugcomm.rb」になるのかな?
デバッギのラッパが実質のデバッグ処理をこなし,
そいつへの入出力はリモートデバッガが行う,と.

# この構成にdRubyが使えるとかっこいいですよねぇ... > せきさん
# と,振ってしまうやつ.自分で作れ > なひ

> この程度で一応使えてますが、C-cでdebugプロンプトに戻るのは
> どうやればいいんでしょうか。debug用サーバではtrapでつかまえる
> として、どうやってdebuggerに送るのかわかりませぬ。

リモートデバッガからデバッギにsignalを飛ばさないといけないですが,
間にsocketが入ってしまうと相手のプロセスIDがわからない...ので,
簡単な方法ではできないと思います.

うーん,間にもう1層噛ましてみるとか.
デバッギラッパでまずプロセスをforkして,子プロセスでデバッギを動作させ,
親プロセスはリモートデバッガとの通信に専念.
リモートデバッガからsocket経由でsignal発生司令がやってきたら,
子プロセスに対してkill(2)する...

ああ,言うだけは楽だなぁ.^^;