123456789_123456789_123456789_123456789_123456789_

Class: DEBUGGER__::UI_TcpServer

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: DEBUGGER__::UI_ServerBase
Defined in: lib/debug/server.rb

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(host: nil, port: nil) ⇒ UI_TcpServer

[ GitHub ]

  
# File 'lib/debug/server.rb', line 382

def initialize host: nil, port: nil
  @local_addr = nil
  @host = host || CONFIG[:host]
  @port_save_file = nil
  @port = begin
    port_str = (port && port.to_s) || CONFIG[:port] || raise("Specify listening port by RUBY_DEBUG_PORT environment variable.")
    case port_str
    when /\A\d+\z/
      port_str.to_i
    when /\A(\d):(.)\z/
      @port_save_file = $2
      $1.to_i
    else
      raise "Specify digits for port number"
    end
  end

  super()
end

Instance Method Details

#accept

[ GitHub ]

  
# File 'lib/debug/server.rb', line 415

def accept
  retry_cnt = 0
  super # for fork

  begin
    Socket.tcp_server_sockets @host, @port do |socks|
      @local_addr = socks.first.local_address # Change this part if `socks` are multiple.
      rdbg = File.expand_path('../../exe/rdbg', __dir__)
      DEBUGGER__.warn "Debugger can attach via TCP/IP (#{@local_addr.inspect_sockaddr})"

      if @port_save_file
        File.write(@port_save_file, "#{socks[0].local_address.ip_port.to_s}\n")
        DEBUGGER__.warn "Port is saved into #{@port_save_file}"
      end

      DEBUGGER__.info <<~EOS
      With rdbg, use the following command line:
      #
      #   #{rdbg} --attach #{@local_addr.ip_address} #{@local_addr.ip_port}
      #
      EOS

      case CONFIG[:open_frontend]
      when 'chrome'
        chrome_setup
      when 'vscode'
        vscode_setup @local_addr.inspect_sockaddr
      end

      Socket.accept_loop(socks) do |sock, client|
        @client_addr = client
        yield @sock_for_fork = sock
      end
    end
  rescue Errno::EADDRINUSE
    if retry_cnt < 10
      retry_cnt += 1
      sleep 0.1
      retry
    else
      raise
    end
  rescue Terminate
    # OK
  rescue => e
    $stderr.puts e.inspect, e.message
    pp e.backtrace
    exit
  end
ensure
  @sock_for_fork = nil

  if @port_save_file && File.exist?(@port_save_file)
    File.unlink(@port_save_file)
  end
end

#chrome_setup

[ GitHub ]

  
# File 'lib/debug/server.rb', line 402

def chrome_setup
  require_relative 'server_cdp'

  unless @chrome_pid = UI_CDP.setup_chrome(@local_addr.inspect_sockaddr)
    DEBUGGER__.warn <<~EOS
      With Chrome browser, type the following URL in the address-bar:

         devtools://devtools/bundled/inspector.html?v8only=true&panel=sources&ws=#{@local_addr.inspect_sockaddr}/#{SecureRandom.uuid}

      EOS
  end
end