ruby-debug-ide22 0.7.4 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +75 -75
  3. data/ChangeLog.archive +1073 -1073
  4. data/ChangeLog.md +594 -594
  5. data/Gemfile +38 -38
  6. data/MIT-LICENSE +24 -24
  7. data/Rakefile +92 -92
  8. data/bin/gdb_wrapper +96 -96
  9. data/bin/rdebug-ide +200 -200
  10. data/ext/mkrf_conf.rb +44 -44
  11. data/lib/ruby-debug-ide/attach/debugger_loader.rb +20 -20
  12. data/lib/ruby-debug-ide/attach/gdb.rb +73 -73
  13. data/lib/ruby-debug-ide/attach/lldb.rb +71 -71
  14. data/lib/ruby-debug-ide/attach/native_debugger.rb +133 -133
  15. data/lib/ruby-debug-ide/attach/process_thread.rb +54 -54
  16. data/lib/ruby-debug-ide/attach/util.rb +114 -114
  17. data/lib/ruby-debug-ide/command.rb +187 -187
  18. data/lib/ruby-debug-ide/commands/breakpoints.rb +128 -128
  19. data/lib/ruby-debug-ide/commands/catchpoint.rb +64 -64
  20. data/lib/ruby-debug-ide/commands/condition.rb +51 -51
  21. data/lib/ruby-debug-ide/commands/control.rb +164 -158
  22. data/lib/ruby-debug-ide/commands/enable.rb +203 -203
  23. data/lib/ruby-debug-ide/commands/eval.rb +64 -64
  24. data/lib/ruby-debug-ide/commands/expression_info.rb +71 -71
  25. data/lib/ruby-debug-ide/commands/file_filtering.rb +106 -106
  26. data/lib/ruby-debug-ide/commands/frame.rb +155 -155
  27. data/lib/ruby-debug-ide/commands/inspect.rb +25 -25
  28. data/lib/ruby-debug-ide/commands/load.rb +17 -17
  29. data/lib/ruby-debug-ide/commands/stepping.rb +108 -108
  30. data/lib/ruby-debug-ide/commands/threads.rb +178 -178
  31. data/lib/ruby-debug-ide/commands/variables.rb +154 -154
  32. data/lib/ruby-debug-ide/event_processor.rb +71 -71
  33. data/lib/ruby-debug-ide/greeter.rb +42 -42
  34. data/lib/ruby-debug-ide/helper.rb +33 -33
  35. data/lib/ruby-debug-ide/ide_processor.rb +155 -155
  36. data/lib/ruby-debug-ide/interface.rb +47 -45
  37. data/lib/ruby-debug-ide/multiprocess/monkey.rb +46 -46
  38. data/lib/ruby-debug-ide/multiprocess/pre_child.rb +58 -58
  39. data/lib/ruby-debug-ide/multiprocess/starter.rb +10 -10
  40. data/lib/ruby-debug-ide/multiprocess/unmonkey.rb +30 -30
  41. data/lib/ruby-debug-ide/multiprocess.rb +22 -22
  42. data/lib/ruby-debug-ide/thread_alias.rb +26 -26
  43. data/lib/ruby-debug-ide/version.rb +3 -3
  44. data/lib/ruby-debug-ide/xml_printer.rb +570 -570
  45. data/lib/ruby-debug-ide.rb +230 -228
  46. data/ruby-debug-ide.gemspec +47 -47
  47. metadata +4 -4
@@ -1,154 +1,154 @@
1
- module Debugger
2
- class VarConstantCommand < Command # :nodoc:
3
- def regexp
4
- /^\s*v(?:ar)?\s+c(?:onst(?:ant)?)?\s+/
5
- end
6
-
7
- def execute
8
- obj = debug_eval(@match.post_match)
9
- unless obj.kind_of? Module
10
- print_msg "Should be Class/Module: %s", @match.post_match
11
- else
12
- print_variables(obj.constants, "constant") do |var|
13
- obj.const_get(var)
14
- end
15
- end
16
- end
17
-
18
- class << self
19
- def help_command
20
- 'var'
21
- end
22
-
23
- def help(cmd)
24
- %{
25
- v[ar] c[onst] <object>\t\tshow constants of object
26
- }
27
- end
28
- end
29
- end
30
-
31
- class VarGlobalCommand < Command # :nodoc:
32
- def regexp
33
- /^\s*v(?:ar)?\s+g(?:lobal)?\s*$/
34
- end
35
-
36
- def execute
37
- globals = []
38
- if RUBY_VERSION < "1.9"
39
- globals = global_variables - ['$=', '$IGNORECASE']
40
- else
41
- globals = global_variables - [:$KCODE, :$-K, :$=, :$IGNORECASE, :$FILENAME]
42
- end
43
- print_variables(globals, 'global') do |var|
44
- debug_eval(var)
45
- end
46
- end
47
-
48
- class << self
49
- def help_command
50
- 'var'
51
- end
52
-
53
- def help(cmd)
54
- %{
55
- v[ar] g[lobal]\t\t\tshow global variables
56
- }
57
- end
58
- end
59
- end
60
-
61
- class VarInstanceCommand < Command # :nodoc:
62
- # TODO: try to find out a way to use Kernel.binding for Rubinius
63
- # ::Kernel.binding doesn't for for ruby 1.8 (see RUBY-14679)
64
- BINDING_COMMAND = (defined?(Rubinius) || RUBY_VERSION < '1.9') ? 'binding' : '::Kernel.binding'
65
-
66
- def regexp
67
- # id will be read as first match, name as post match
68
- /^\s*v(?:ar)?\s+i(?:nstance)?\s+((?:[\\+-]0x)[\dabcdef]+)?/
69
- end
70
-
71
- def execute
72
- if (@match[1])
73
- obj = ObjectSpace._id2ref(@match[1].hex) rescue nil
74
-
75
- unless obj
76
- print_element("variables")
77
- @printer.print_msg("Unknown object id : %s", @match[1])
78
- end
79
- else
80
- obj = debug_eval(@match.post_match)
81
- end
82
- return unless obj
83
- if obj.is_a?(Array)
84
- print_array(obj)
85
- elsif obj.is_a?(Hash)
86
- print_hash(obj)
87
- elsif obj.is_a?(String)
88
- print_string(obj)
89
- else
90
- print_element("variables") do
91
- # instance variables
92
- kind = 'instance'
93
- inst_vars = obj.instance_variables
94
- instance_binding = obj.instance_eval(BINDING_COMMAND)
95
- # print self at top position
96
- print_variable('self', debug_eval('self', instance_binding), kind) if inst_vars.include?('self')
97
- inst_vars.sort.each do |var|
98
- print_variable(var, debug_eval(var, instance_binding), kind) unless var == 'self'
99
- end
100
-
101
- # class variables
102
- class_binding = obj.class.class_eval(BINDING_COMMAND)
103
- obj.class.class_variables.sort.each do |var|
104
- print_variable(var, debug_eval(var, class_binding), 'class')
105
- end
106
- end
107
- end
108
- end
109
-
110
- class << self
111
- def help_command
112
- 'var'
113
- end
114
-
115
- def help(cmd)
116
- %{
117
- v[ar] i[nstance] <object>\tshow instance variables of object, object can be given by its id or an expression
118
- }
119
- end
120
- end
121
- end
122
-
123
- class VarLocalCommand < Command # :nodoc:
124
- def regexp
125
- /^\s*v(?:ar)?\s+l(?:ocal)?\s*$/
126
- end
127
-
128
- def execute
129
- locals = @state.context.frame_locals(@state.frame_pos)
130
- _self = @state.context.frame_self(@state.frame_pos)
131
- begin
132
- locals['self'] = _self unless TOPLEVEL_BINDING.eval('self') == _self
133
- rescue => ex
134
- locals['self'] = "<Cannot evaluate self>"
135
- $stderr << "Cannot evaluate self\n#{ex.class.name}: #{ex.message}\n #{ex.backtrace.join("\n ")}"
136
- end
137
- print_variables(locals.keys, 'local') do |var|
138
- locals[var]
139
- end
140
- end
141
-
142
- class << self
143
- def help_command
144
- 'var'
145
- end
146
-
147
- def help(cmd)
148
- %{
149
- v[ar] l[ocal]\t\t\tshow local variables
150
- }
151
- end
152
- end
153
- end
154
- end
1
+ module Debugger
2
+ class VarConstantCommand < Command # :nodoc:
3
+ def regexp
4
+ /^\s*v(?:ar)?\s+c(?:onst(?:ant)?)?\s+/
5
+ end
6
+
7
+ def execute
8
+ obj = debug_eval(@match.post_match)
9
+ unless obj.kind_of? Module
10
+ print_msg "Should be Class/Module: %s", @match.post_match
11
+ else
12
+ print_variables(obj.constants, "constant") do |var|
13
+ obj.const_get(var)
14
+ end
15
+ end
16
+ end
17
+
18
+ class << self
19
+ def help_command
20
+ 'var'
21
+ end
22
+
23
+ def help(cmd)
24
+ %{
25
+ v[ar] c[onst] <object>\t\tshow constants of object
26
+ }
27
+ end
28
+ end
29
+ end
30
+
31
+ class VarGlobalCommand < Command # :nodoc:
32
+ def regexp
33
+ /^\s*v(?:ar)?\s+g(?:lobal)?\s*$/
34
+ end
35
+
36
+ def execute
37
+ globals = []
38
+ if RUBY_VERSION < "1.9"
39
+ globals = global_variables - ['$=', '$IGNORECASE']
40
+ else
41
+ globals = global_variables - [:$KCODE, :$-K, :$=, :$IGNORECASE, :$FILENAME]
42
+ end
43
+ print_variables(globals, 'global') do |var|
44
+ debug_eval(var)
45
+ end
46
+ end
47
+
48
+ class << self
49
+ def help_command
50
+ 'var'
51
+ end
52
+
53
+ def help(cmd)
54
+ %{
55
+ v[ar] g[lobal]\t\t\tshow global variables
56
+ }
57
+ end
58
+ end
59
+ end
60
+
61
+ class VarInstanceCommand < Command # :nodoc:
62
+ # TODO: try to find out a way to use Kernel.binding for Rubinius
63
+ # ::Kernel.binding doesn't for for ruby 1.8 (see RUBY-14679)
64
+ BINDING_COMMAND = (defined?(Rubinius) || RUBY_VERSION < '1.9') ? 'binding' : '::Kernel.binding'
65
+
66
+ def regexp
67
+ # id will be read as first match, name as post match
68
+ /^\s*v(?:ar)?\s+i(?:nstance)?\s+((?:[\\+-]0x)[\dabcdef]+)?/
69
+ end
70
+
71
+ def execute
72
+ if (@match[1])
73
+ obj = ObjectSpace._id2ref(@match[1].hex) rescue nil
74
+
75
+ unless obj
76
+ print_element("variables")
77
+ @printer.print_msg("Unknown object id : %s", @match[1])
78
+ end
79
+ else
80
+ obj = debug_eval(@match.post_match)
81
+ end
82
+ return unless obj
83
+ if obj.is_a?(Array)
84
+ print_array(obj)
85
+ elsif obj.is_a?(Hash)
86
+ print_hash(obj)
87
+ elsif obj.is_a?(String)
88
+ print_string(obj)
89
+ else
90
+ print_element("variables") do
91
+ # instance variables
92
+ kind = 'instance'
93
+ inst_vars = obj.instance_variables
94
+ instance_binding = obj.instance_eval(BINDING_COMMAND)
95
+ # print self at top position
96
+ print_variable('self', debug_eval('self', instance_binding), kind) if inst_vars.include?('self')
97
+ inst_vars.sort.each do |var|
98
+ print_variable(var, debug_eval(var, instance_binding), kind) unless var == 'self'
99
+ end
100
+
101
+ # class variables
102
+ class_binding = obj.class.class_eval(BINDING_COMMAND)
103
+ obj.class.class_variables.sort.each do |var|
104
+ print_variable(var, debug_eval(var, class_binding), 'class')
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ class << self
111
+ def help_command
112
+ 'var'
113
+ end
114
+
115
+ def help(cmd)
116
+ %{
117
+ v[ar] i[nstance] <object>\tshow instance variables of object, object can be given by its id or an expression
118
+ }
119
+ end
120
+ end
121
+ end
122
+
123
+ class VarLocalCommand < Command # :nodoc:
124
+ def regexp
125
+ /^\s*v(?:ar)?\s+l(?:ocal)?\s*$/
126
+ end
127
+
128
+ def execute
129
+ locals = @state.context.frame_locals(@state.frame_pos)
130
+ _self = @state.context.frame_self(@state.frame_pos)
131
+ begin
132
+ locals['self'] = _self unless TOPLEVEL_BINDING.eval('self') == _self
133
+ rescue => ex
134
+ locals['self'] = "<Cannot evaluate self>"
135
+ $stderr << "Cannot evaluate self\n#{ex.class.name}: #{ex.message}\n #{ex.backtrace.join("\n ")}"
136
+ end
137
+ print_variables(locals.keys, 'local') do |var|
138
+ locals[var]
139
+ end
140
+ end
141
+
142
+ class << self
143
+ def help_command
144
+ 'var'
145
+ end
146
+
147
+ def help(cmd)
148
+ %{
149
+ v[ar] l[ocal]\t\t\tshow local variables
150
+ }
151
+ end
152
+ end
153
+ end
154
+ end
@@ -1,71 +1,71 @@
1
- require 'ruby-debug-ide/xml_printer'
2
-
3
- module Debugger
4
-
5
- class EventProcessor
6
-
7
- attr_accessor :line, :file, :context
8
-
9
- def initialize(interface)
10
- @printer = XmlPrinter.new(interface)
11
- @interface = interface
12
- @line = nil
13
- @file = nil
14
- @last_breakpoint = nil
15
- end
16
-
17
- def at_breakpoint(context, breakpoint)
18
- raise "@last_breakpoint supposed to be nil. is #{@last_breakpoint}" if @last_breakpoint
19
- # at_breakpoint is immediately followed by #at_line event in
20
- # ruby-debug-base. So postpone breakpoint printing until #at_line.
21
- @last_breakpoint = breakpoint
22
- end
23
-
24
- def at_catchpoint(context, excpt)
25
- @printer.print_catchpoint(excpt)
26
- end
27
-
28
- def at_tracing(context, file, line)
29
- @printer.print_trace(context, file, line)
30
- end
31
-
32
- def at_line(context, file, line)
33
- @printer.print_at_line(context, file, line) if context.nil? || context.stop_reason == :step
34
- line_event(context, file, line)
35
- end
36
-
37
- def at_return(context, file, line)
38
- @printer.print_at_line(context, file, line)
39
- context.stop_frame = -1
40
- line_event(context, file, line)
41
- end
42
-
43
- def line_event(context, file, line)
44
- @line = line
45
- @file = file
46
- @context = context
47
- if @last_breakpoint
48
- # followed after #at_breakpoint in the same thread. Print breakpoint
49
- # now when @line, @file and @context are correctly set to prevent race
50
- # condition with `control thread'.
51
- n = Debugger.breakpoints.index(@last_breakpoint) + 1
52
- @printer.print_breakpoint n, @last_breakpoint
53
- @last_breakpoint = nil
54
- end
55
- raise "DebuggerThread are not supposed to be traced (#{context.thread})" if context.thread.is_a?(Debugger::DebugThread)
56
- @printer.print_debug("Stopping Thread %s (%s)", context.thread.to_s, Process.pid.to_s)
57
- @printer.print_debug("Threads equal: %s", Thread.current == context.thread)
58
- IdeCommandProcessor.new(@interface).process_commands
59
- InspectCommand.clear_references
60
- @printer.print_debug("Resumed Thread %s", context.thread.to_s)
61
- @line = nil
62
- @file = nil
63
- @context = nil
64
- end
65
-
66
- def at_line?
67
- @line
68
- end
69
-
70
- end
71
- end
1
+ require 'ruby-debug-ide/xml_printer'
2
+
3
+ module Debugger
4
+
5
+ class EventProcessor
6
+
7
+ attr_accessor :line, :file, :context
8
+
9
+ def initialize(interface)
10
+ @printer = XmlPrinter.new(interface)
11
+ @interface = interface
12
+ @line = nil
13
+ @file = nil
14
+ @last_breakpoint = nil
15
+ end
16
+
17
+ def at_breakpoint(context, breakpoint)
18
+ raise "@last_breakpoint supposed to be nil. is #{@last_breakpoint}" if @last_breakpoint
19
+ # at_breakpoint is immediately followed by #at_line event in
20
+ # ruby-debug-base. So postpone breakpoint printing until #at_line.
21
+ @last_breakpoint = breakpoint
22
+ end
23
+
24
+ def at_catchpoint(context, excpt)
25
+ @printer.print_catchpoint(excpt)
26
+ end
27
+
28
+ def at_tracing(context, file, line)
29
+ @printer.print_trace(context, file, line)
30
+ end
31
+
32
+ def at_line(context, file, line)
33
+ @printer.print_at_line(context, file, line) if context.nil? || context.stop_reason == :step
34
+ line_event(context, file, line)
35
+ end
36
+
37
+ def at_return(context, file, line)
38
+ @printer.print_at_line(context, file, line)
39
+ context.stop_frame = -1
40
+ line_event(context, file, line)
41
+ end
42
+
43
+ def line_event(context, file, line)
44
+ @line = line
45
+ @file = file
46
+ @context = context
47
+ if @last_breakpoint
48
+ # followed after #at_breakpoint in the same thread. Print breakpoint
49
+ # now when @line, @file and @context are correctly set to prevent race
50
+ # condition with `control thread'.
51
+ n = Debugger.breakpoints.index(@last_breakpoint) + 1
52
+ @printer.print_breakpoint n, @last_breakpoint
53
+ @last_breakpoint = nil
54
+ end
55
+ raise "DebuggerThread are not supposed to be traced (#{context.thread})" if context.thread.is_a?(Debugger::DebugThread)
56
+ @printer.print_debug("Stopping Thread %s (%s)", context.thread.to_s, Process.pid.to_s)
57
+ @printer.print_debug("Threads equal: %s", Thread.current == context.thread)
58
+ IdeCommandProcessor.new(@interface).process_commands
59
+ InspectCommand.clear_references
60
+ @printer.print_debug("Resumed Thread %s", context.thread.to_s)
61
+ @line = nil
62
+ @file = nil
63
+ @context = nil
64
+ end
65
+
66
+ def at_line?
67
+ @line
68
+ end
69
+
70
+ end
71
+ end
@@ -1,42 +1,42 @@
1
- if RUBY_VERSION < '2.0' || defined?(JRUBY_VERSION)
2
- require 'ruby-debug-base'
3
- else
4
- require 'debase'
5
- end
6
-
7
- require 'ruby-debug-ide/version'
8
- require 'ruby-debug-ide/ide_processor'
9
-
10
- module Debugger
11
-
12
- class << self
13
- def print_greeting_msg(stream, host, port, debugger_name = "Fast", socket_path = nil)
14
- base_gem_name = if defined?(JRUBY_VERSION) || RUBY_VERSION < '1.9.0'
15
- 'ruby-debug-base'
16
- elsif RUBY_VERSION < '2.0.0'
17
- 'ruby-debug-base19x'
18
- else
19
- 'debase'
20
- end
21
-
22
- file_filtering_support = if Command.file_filter_supported?
23
- 'supported'
24
- else
25
- 'not supported'
26
- end
27
-
28
- if host && port
29
- listens_on = " listens on #{host}:#{port}\n"
30
- elsif socket_path
31
- listens_on = " listens on #{socket_path}\n"
32
- else
33
- listens_on = "\n"
34
- end
35
-
36
- msg = "#{debugger_name} Debugger (ruby-debug-ide #{IDE_VERSION}, #{base_gem_name} #{VERSION}, file filtering is #{file_filtering_support})" + listens_on
37
-
38
- stream.printf msg
39
- end
40
- end
41
-
42
- end
1
+ if RUBY_VERSION < '2.0' || defined?(JRUBY_VERSION)
2
+ require 'ruby-debug-base'
3
+ else
4
+ require 'debase'
5
+ end
6
+
7
+ require 'ruby-debug-ide/version'
8
+ require 'ruby-debug-ide/ide_processor'
9
+
10
+ module Debugger
11
+
12
+ class << self
13
+ def print_greeting_msg(stream, host, port, debugger_name = "Fast", socket_path = nil)
14
+ base_gem_name = if defined?(JRUBY_VERSION) || RUBY_VERSION < '1.9.0'
15
+ 'ruby-debug-base'
16
+ elsif RUBY_VERSION < '2.0.0'
17
+ 'ruby-debug-base19x'
18
+ else
19
+ 'debase'
20
+ end
21
+
22
+ file_filtering_support = if Command.file_filter_supported?
23
+ 'supported'
24
+ else
25
+ 'not supported'
26
+ end
27
+
28
+ if host && port
29
+ listens_on = " listens on #{host}:#{port}\n"
30
+ elsif socket_path
31
+ listens_on = " listens on #{socket_path}\n"
32
+ else
33
+ listens_on = "\n"
34
+ end
35
+
36
+ msg = "#{debugger_name} Debugger (ruby-debug-ide #{IDE_VERSION}, #{base_gem_name} #{VERSION}, file filtering is #{file_filtering_support})" + listens_on
37
+
38
+ stream.printf msg
39
+ end
40
+ end
41
+
42
+ end
@@ -1,33 +1,33 @@
1
- module Debugger
2
-
3
- module ParseFunctions
4
- # Parse 'str' of command 'cmd' as an integer between
5
- # min and max. If either min or max is nil, that
6
- # value has no bound.
7
- def get_int(str, cmd, min=nil, max=nil, default=1)
8
- return default unless str
9
- begin
10
- int = Integer(str)
11
- if min and int < min
12
- print_error "%s argument '%s' needs to at least %s.\n" % [cmd, str, min]
13
- return nil
14
- elsif max and int > max
15
- print_error "%s argument '%s' needs to at most %s.\n" % [cmd, str, max]
16
- return nil
17
- end
18
- return int
19
- rescue
20
- print_error "%s argument '%s' needs to be a number.\n" % [cmd, str]
21
- return nil
22
- end
23
- end
24
-
25
- # Return true if code is syntactically correct for Ruby.
26
- def syntax_valid?(code)
27
- eval("BEGIN {return true}\n#{code}", nil, "", 0)
28
- rescue Exception
29
- false
30
- end
31
-
32
- end
33
- end
1
+ module Debugger
2
+
3
+ module ParseFunctions
4
+ # Parse 'str' of command 'cmd' as an integer between
5
+ # min and max. If either min or max is nil, that
6
+ # value has no bound.
7
+ def get_int(str, cmd, min=nil, max=nil, default=1)
8
+ return default unless str
9
+ begin
10
+ int = Integer(str)
11
+ if min and int < min
12
+ print_error "%s argument '%s' needs to at least %s.\n" % [cmd, str, min]
13
+ return nil
14
+ elsif max and int > max
15
+ print_error "%s argument '%s' needs to at most %s.\n" % [cmd, str, max]
16
+ return nil
17
+ end
18
+ return int
19
+ rescue
20
+ print_error "%s argument '%s' needs to be a number.\n" % [cmd, str]
21
+ return nil
22
+ end
23
+ end
24
+
25
+ # Return true if code is syntactically correct for Ruby.
26
+ def syntax_valid?(code)
27
+ eval("BEGIN {return true}\n#{code}", nil, "", 0)
28
+ rescue Exception
29
+ false
30
+ end
31
+
32
+ end
33
+ end