From 57f4243060d8b4e5b892be55f2a429138d579e4b Mon Sep 17 00:00:00 2001 From: Dlani Mendes Date: Tue, 24 Apr 2018 14:11:44 -0300 Subject: [PATCH] Server Mode --- bin/rdebug-ide | 17 +++++++++-------- lib/ruby-debug-ide.rb | 13 ++++++++++++- lib/ruby-debug-ide/commands/control.rb | 4 +++- lib/ruby-debug-ide/ide_processor.rb | 2 ++ 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/bin/rdebug-ide b/bin/rdebug-ide index 3054353..33616d4 100755 --- a/bin/rdebug-ide +++ b/bin/rdebug-ide @@ -28,7 +28,8 @@ options = OpenStruct.new( 'value_as_nested_element' => false, 'attach_mode' => false, 'cli_debug' => false, - 'key_value_mode' => false + 'key_value_mode' => false, + 'server_mode' => false ) opts = OptionParser.new do |opts| @@ -84,6 +85,9 @@ EOB opts.on("--key-value", "Key/Value presentation of hash items") do options.key_value_mode = true end + opts.on("--server-mode", "Tells that rdebug-ide is working in server mode") do + options.server_mode = true + end opts.on("--ignore-port", "Generate another port") do options.ignore_port = true end @@ -137,13 +141,7 @@ end if options.dispatcher_port != -1 ENV['IDE_PROCESS_DISPATCHER'] = options.dispatcher_port.to_s - if RUBY_VERSION < "1.9" - lib_path = File.expand_path(File.dirname(__FILE__) + "/../lib/") - $: << lib_path unless $:.include? lib_path - require 'ruby-debug-ide/multiprocess' - else - require_relative '../lib/ruby-debug-ide/multiprocess' - end + Debugger.require_multiprocess Debugger::MultiProcess.do_monkey ENV['DEBUGGER_STORED_RUBYLIB'] = ENV['RUBYLIB'] @@ -171,8 +169,11 @@ Debugger.inspect_time_limit = options.inspect_time_limit Debugger.catchpoint_deleted_event = options.catchpoint_deleted_event || options.rm_protocol_extensions Debugger.value_as_nested_element = options.value_as_nested_element || options.rm_protocol_extensions Debugger.key_value_mode = options.key_value_mode +Debugger.server_mode = options.server_mode if options.attach_mode + Debugger.require_multiprocess + if Debugger::FRONT_END == "debase" Debugger.init_variables end diff --git a/lib/ruby-debug-ide.rb b/lib/ruby-debug-ide.rb index 10f70f4..2a013c7 100644 --- a/lib/ruby-debug-ide.rb +++ b/lib/ruby-debug-ide.rb @@ -18,6 +18,16 @@ module Debugger class << self + def require_multiprocess + if RUBY_VERSION < "1.9" + lib_path = File.expand_path(File.dirname(__FILE__) + "/../lib/") + $: << lib_path unless $:.include? lib_path + require 'ruby-debug-ide/multiprocess' + else + require_relative '../lib/ruby-debug-ide/multiprocess' + end + end + def find_free_port(host) server = TCPServer.open(host, 0) port = server.addr[1] @@ -58,6 +68,7 @@ def cleanup_backtrace(backtrace) attr_reader :interface # protocol extensions attr_accessor :catchpoint_deleted_event, :value_as_nested_element + attr_accessor :server_mode # @@ -89,7 +100,7 @@ def prepare_debugger(options) # wait for 'start' command @mutex.synchronize do - @proceed.wait(@mutex) + @proceed.wait(@mutex) unless server_mode end end diff --git a/lib/ruby-debug-ide/commands/control.rb b/lib/ruby-debug-ide/commands/control.rb index 6fd030f..e5c4c45 100644 --- a/lib/ruby-debug-ide/commands/control.rb +++ b/lib/ruby-debug-ide/commands/control.rb @@ -136,11 +136,13 @@ def regexp end def execute + Debugger.require_multiprocess + interface.command_queue << "finish" if Debugger.server_mode Debugger.stop Debugger.interface.close Debugger::MultiProcess.undo_monkey Debugger.control_thread = nil - Thread.current.exit #@control_thread is a current thread + Thread.current.exit unless Debugger.server_mode #@control_thread is a current thread end class << self diff --git a/lib/ruby-debug-ide/ide_processor.rb b/lib/ruby-debug-ide/ide_processor.rb index e04f651..424981b 100644 --- a/lib/ruby-debug-ide/ide_processor.rb +++ b/lib/ruby-debug-ide/ide_processor.rb @@ -90,6 +90,8 @@ def process_commands end end rescue ::Exception + # Workaround to Disconnect in Paused State + return @interface.command_queue << "finish" if $!.message === 'closed stream' @printer.print_debug "INTERNAL ERROR!!! #{$!}\n" rescue nil @printer.print_error "INTERNAL ERROR!!! #{$!}\n" rescue nil @printer.print_error $!.backtrace.map{|l| "\t#{l}"}.join("\n") rescue nil