diff --git a/bin/rdebug-ide b/bin/rdebug-ide index 618e291..59af231 100755 --- a/bin/rdebug-ide +++ b/bin/rdebug-ide @@ -139,13 +139,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'] @@ -173,8 +167,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.skip_wait_for_start = options.skip_wait_for_start 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 97644df..64cc96e 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 :skip_wait_for_start # diff --git a/lib/ruby-debug-ide/commands/control.rb b/lib/ruby-debug-ide/commands/control.rb index 6fd030f..0504418 100644 --- a/lib/ruby-debug-ide/commands/control.rb +++ b/lib/ruby-debug-ide/commands/control.rb @@ -22,13 +22,13 @@ def help_command def help(cmd) %{ - q[uit]\texit from debugger, + q[uit]\texit from debugger, exit\talias to quit } end end end - + class RestartCommand < Command # :nodoc: self.control = true @@ -39,7 +39,7 @@ def regexp $ /x end - + def execute if not defined? Debugger::RDEBUG_SCRIPT or not defined? Debugger::ARGV print "We are not in a context we can restart from.\n" @@ -64,7 +64,7 @@ def help_command def help(cmd) %{ - restart|R [args] + restart|R [args] Restart the program. This is is a re-exec - all debugger state is lost. If command arguments are passed those are used. } @@ -78,7 +78,7 @@ class StartCommand < Command # :nodoc: def regexp /^\s*(start)(\s+ \S+ .*)?$/x end - + def execute @printer.print_debug("Starting: running program script") Debugger.run_prog_script #Debugger.prog_script_running? @@ -102,23 +102,23 @@ class InterruptCommand < Command # :nodoc: self.event = false self.control = true self.need_context = true - + def regexp /^\s*i(?:nterrupt)?\s*$/ end - + def execute unless Debugger.interrupt_last context = Debugger.thread_context(Thread.main) context.interrupt end end - + class << self def help_command 'interrupt' end - + def help(cmd) %{ i[nterrupt]\tinterrupt the program @@ -136,11 +136,13 @@ def regexp end def execute + Debugger.require_multiprocess + interface.command_queue << "finish" if Debugger.skip_wait_for_start 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.skip_wait_for_start #@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