From: "NAKAMURA, Hiroshi" Date: 1999-09-07T19:00:14+09:00 Subject: [ruby-list:16589] Re: ruby debugger (like gdb attach) なひです.なんか今ごろ.^^; > From: Kikutani Makoto [mailto:kikutani@sprintmail.com] > Sent: Monday, August 30, 1999 1:26 AM > 簡単なのを作りました。remotedebug.rb と debug-client.rb を > rubyのPATHに置いて、 > > ruby -rremotedebug.rb cur.rb > > てな感じです。 試してみました.(^-^ > 問題点がいくつか。 > > 1) 開くのがrxvt決め打ちになっているが、ktermなどにしたいとき > どうやって指定したらいいか? どうしたもんでしょう.^^; > 2) debug-client.rb のほうではreadlineを使いたいけど、threadを使ってる > せいか、やると異様に遅くなる 異様...ですか.なひの環境Solaris2.5.1 + ruby-1.4.0 + ktermでは それほどでもないみたいです... > 3) debug-client.rb のほうでコマンド待ちのとき (rdb:-) を出したいが、 > うまく行かない これはちょっと試してみましたが,なかなか難しいですね.^^; プロンプトが"(rdb:-) "固定ならいいですが, 別のプロンプト,例えば"really quit? (y/n) "なんてのもあるし... > 4) 前にも書いたとおり、debug-client.rb からCTL-Cをdebuggerにわたしたい 対処してみました.あまり難しく考えることなかった.必殺引数渡し.:-) / / / で,使い勝手を考えるともっともっと手を入れたいところですが, かなり抜本的な変更が必要になりそうなので止めました.あちこち手抜きです. remote debugについて,も少し考えてから手を出すかもしれません. 出さないかもしれません.^^; ところでどなたか,Patch後のremotedebug.rbのINTのhandlerで, signal handlerを再設定しないといけなくなる理由, どなたかご存知ありませんか? 呼び出し関係が複雑で追いきれない... / / / remotedebug.rbのPatch. --- remotedebug.rb.dist Tue Sep 7 15:59:38 1999 +++ remotedebug.rb Tue Sep 7 18:47:20 1999 @@ -1,4 +1,12 @@ require "socket" class DEBUGGER__ + + def readline(prompt, hist) + @debug_port.print prompt + line = @debug_port.gets + line.chomp! + line + end + trap("INT") { DEBUGGER__::CONTEXT.interrupt } $DEBUG = true @@ -17,11 +25,13 @@ end return unless dbg_clnt - debug_socket = "/tmp/ruby-debug" + debug_socket = "/tmp/ruby-debug#{$$}" if FileTest.exist?(debug_socket) File.unlink debug_socket end us = UNIXserver.open(debug_socket) - system("rxvt -e #{dbg_clnt} #{debug_socket} &") + system("kterm -e #{dbg_clnt} #{debug_socket} #{$$} &") + #system("rxvt -e #{dbg_clnt} #{debug_socket} #{$$} &") @debug_port = us.accept + @debug_port.sync = true end @@ -29,4 +39,5 @@ def interrupt + trap("INT") { DEBUGGER__::CONTEXT.interrupt } @stop_next = 1 end @@ -59,5 +70,5 @@ @frames[0] = binding display_expressions(binding) - while input = @debug_port.gets.chomp + while input = readline("(rdb:-) ", true) if input == "" input = DEBUG_LAST_CMD[0] / / / debug-client.rbは大幅に書き換えたので,ぜんぶ. #!/usr/bin/env ruby require "socket" debug_socket = ARGV.shift or raise remote_pid = ( ARGV.shift or raise ).to_i port = UNIXsocket.new( debug_socket ) port.sync = true STDOUT.sync = true $reader = Thread.new do buf = "" while true begin buf = port.sysread( 1024 ) STDOUT.print buf rescue puts( 'Remote process died...' ) break end end end begin require 'readline' def readline( prompt, hist ) Readline::readline( prompt, hist ) end rescue LoadError def readline( prompt, hist ) STDOUT.print prompt line = STDIN.gets line.chomp! line end end trap( "INT" ) { Process.kill( "INT", remote_pid ) } while input = readline( "", true ) port.print input << "\n" break unless $reader.alive? end $reader.join() File.unlink debug_socket