Fix up Rubinius specific library specs.
[rbx.git] / lib / debugger / debug_server.rb
blob255acc49667d76eceb9fc496025713e25655737d
1 require 'debugger/interface'
2 require 'socket'
3 require 'cgi'
5 class Debugger
6   class Server < Interface
7     REMOTE_DEBUG_PORT = 1098
9     class ClientQuitError < RuntimeError; end
11     def initialize(port=REMOTE_DEBUG_PORT, host=nil)
12       @port = port
13       @host = host
14       Debugger.instance.interface = self
15       load_commands
16     end
18     # Begins listening on the configured host/port for debugger commands
19     def listen
20       @server = @host ? TCPServer.open(@host, @port) : TCPServer.open(@port)
21       @server.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, [1].pack("i"))
22       at_exit { close }
24       addrs = @server.addr[2..-1].uniq
26       STDOUT.puts "*** Debugger listening on #{addrs.collect{|a|"#{a}:#{@port}"}.join(' ')}"
28       # Wait for a debugger client to connect
29       @client = @server.accept
30       STDOUT.puts "*** Debugger client connected from #{@client.peeraddr[2]}:#{@client.peeraddr[1]}"
31     end
33     # Debugger callback implementation for getting debug commands from a user
34     def process_commands(dbg, thread, ctxt, bp_list)
35       begin
36         until @done do
37           while line = @client.gets # read a line at a time
38             line.chomp!
39             line.strip!
40             STDOUT.puts "[#{Time.now}]: #{line}"
41             output = process_command(dbg, line)
42             @client.puts CGI::escape(output.to_s)
43             @client.flush
44             break if @done
45           end
47           unless line
48             STDOUT.puts "*** EOF on socket - client disconnected"
49             dbg.quit!
50           end
51         end
52       rescue => e
53         STDOUT.puts "*** Client disconnected"
54         STDERR.puts e
55         STDERR.puts e.awesome_backtrace
56         dbg.quit!
57       ensure
58         if dbg.quit?
59           close
60         end
61       end
62     end
64     # Closes the connection to the client
65     def close
66       if @client
67         @client.puts 'finished'
68         @client.flush
69         @client.close # close socket on error
70       end
71       if @server
72         @server.close
73         @server = nil
74         STDOUT.puts "*** Debug server finished"
75       end
76     end
77   end
78 end