ruby-debug 0.4.5-mswin32 → 0.5-mswin32

Sign up to get free protection for your applications and to get access to all the features.
data/bin/rdebug CHANGED
@@ -6,14 +6,15 @@ require "ostruct"
6
6
  require 'ruby-debug'
7
7
 
8
8
  options = OpenStruct.new(
9
- 'server' => false,
10
- 'client' => false,
11
- 'host' => nil,
12
- 'port' => Debugger::PORT,
13
- 'cport' => Debugger::PORT + 1,
14
- 'wait' => false,
15
- 'nostop' => false,
16
- 'script' => nil
9
+ 'server' => false,
10
+ 'client' => false,
11
+ 'host' => nil,
12
+ 'port' => Debugger::PORT,
13
+ 'cport' => Debugger::PORT + 1,
14
+ 'wait' => false,
15
+ 'nostop' => false,
16
+ 'post_mortem' => false,
17
+ 'script' => nil
17
18
  )
18
19
 
19
20
  opts = OptionParser.new do |opts|
@@ -26,6 +27,7 @@ EOB
26
27
  opts.on("-s", "--server", "Listen for remote connections") {options.server = true}
27
28
  opts.on("-w", "--wait", "Wait for a client connection, implies -s option") {options.wait = true}
28
29
  opts.on("-n", "--nostop", "Do not stop when a client connects, implies -s option") {options.nostop = true}
30
+ opts.on("-m", "--post-mortem", "Activate post-mortem mode") {options.post_mortem = true}
29
31
  opts.on("-c", "--client", "Connect to remote debugger") {options.client = true}
30
32
  opts.on("-h", "--host HOST", "Host name used for remote debugging") {|options.host|}
31
33
  opts.on("-p", "--port PORT", Integer, "Port used for remote debugging") {|options.port|}
@@ -75,13 +77,14 @@ else
75
77
  Debugger.wait_connection = options.wait
76
78
  load "#{ENV["HOME"]}/.rdebugrc" if File.exists?("#{ENV["HOME"]}/.rdebugrc")
77
79
  if options.server
78
- Debugger.start_remote(options.host, [options.port, options.cport])
80
+ Debugger.start_remote(options.host, [options.port, options.cport], options.post_mortem)
79
81
  Debugger.debug_load ARGV.shift
80
82
  else
81
83
  Debugger.start
82
84
  if options.script
83
85
  Debugger.run_script(options.script)
84
86
  end
87
+ Debugger.post_mortem if options.post_mortem
85
88
  debugger 2
86
89
  Debugger.debug_load ARGV.shift
87
90
  end
data/ext/ruby_debug.c CHANGED
@@ -4,7 +4,7 @@
4
4
  #include <rubysig.h>
5
5
  #include <st.h>
6
6
 
7
- #define DEBUG_VERSION "0.4.5"
7
+ #define DEBUG_VERSION "0.5"
8
8
 
9
9
  #define CTX_FL_MOVED (1<<1)
10
10
  #define CTX_FL_SUSPEND (1<<2)
@@ -57,6 +57,7 @@ static VALUE breakpoints = Qnil;
57
57
  static VALUE catchpoint = Qnil;
58
58
  static VALUE tracing = Qfalse;
59
59
  static VALUE locker = Qnil;
60
+ static VALUE post_mortem = Qfalse;
60
61
 
61
62
  static VALUE mDebugger;
62
63
  static VALUE cThreadsTable;
@@ -472,7 +473,8 @@ check_breakpoint_expression(VALUE breakpoint, VALUE binding)
472
473
  static void
473
474
  debug_event_hook(rb_event_t event, NODE *node, VALUE self, ID mid, VALUE klass)
474
475
  {
475
- VALUE thread, context, binding, breakpoint;
476
+ VALUE thread, context, breakpoint;
477
+ VALUE binding = Qnil;
476
478
  debug_context_t *debug_context;
477
479
  VALUE file = Qnil, line = Qnil;
478
480
  int breakpoint_index = -1;
@@ -621,6 +623,16 @@ debug_event_hook(rb_event_t event, NODE *node, VALUE self, ID mid, VALUE klass)
621
623
  VALUE ancestors;
622
624
  VALUE expn_class, aclass;
623
625
  int i;
626
+
627
+ if(post_mortem == Qtrue && self)
628
+ {
629
+ binding = create_binding(self);
630
+ rb_ivar_set(ruby_errinfo, rb_intern("@__debug_binding"), binding);
631
+ rb_ivar_set(ruby_errinfo, rb_intern("@__debug_file"), file);
632
+ rb_ivar_set(ruby_errinfo, rb_intern("@__debug_line"), line);
633
+ rb_ivar_set(ruby_errinfo, rb_intern("@__debug_binding"), binding);
634
+ rb_ivar_set(ruby_errinfo, rb_intern("@__debug_frames"), rb_obj_dup(debug_context->frames));
635
+ }
624
636
 
625
637
  expn_class = rb_obj_class(ruby_errinfo);
626
638
  if( !NIL_P(rb_class_inherited_p(expn_class, rb_eSystemExit)) )
@@ -639,7 +651,8 @@ debug_event_hook(rb_event_t event, NODE *node, VALUE self, ID mid, VALUE klass)
639
651
  if(rb_str_cmp(rb_mod_name(aclass), catchpoint) == 0)
640
652
  {
641
653
  rb_funcall(context, idAtCatchpoint, 1, ruby_errinfo);
642
- binding = self? create_binding(self) : Qnil;
654
+ if(self && binding == Qnil)
655
+ binding = create_binding(self);
643
656
  call_at_line(context, debug_context->thnum, binding, file, line);
644
657
  break;
645
658
  }
@@ -703,7 +716,7 @@ debug_start(VALUE self)
703
716
  }
704
717
 
705
718
  if(rb_block_given_p())
706
- return rb_ensure(rb_yield, Qnil, debug_stop_i, self);
719
+ return rb_ensure(rb_yield, self, debug_stop_i, self);
707
720
  return result;
708
721
  }
709
722
 
@@ -1002,7 +1015,7 @@ debug_resume(VALUE self)
1002
1015
  * call-seq:
1003
1016
  * Debugger.tracing -> bool
1004
1017
  *
1005
- * Returns +true+ is a global tracing is activated.
1018
+ * Returns +true+ if the global tracing is activated.
1006
1019
  */
1007
1020
  static VALUE
1008
1021
  debug_tracing(VALUE self)
@@ -1014,7 +1027,7 @@ debug_tracing(VALUE self)
1014
1027
  * call-seq:
1015
1028
  * Debugger.tracing = bool
1016
1029
  *
1017
- * Sets a global tracing flag.
1030
+ * Sets the global tracing flag.
1018
1031
  */
1019
1032
  static VALUE
1020
1033
  debug_set_tracing(VALUE self, VALUE value)
@@ -1023,12 +1036,40 @@ debug_set_tracing(VALUE self, VALUE value)
1023
1036
  return value;
1024
1037
  }
1025
1038
 
1039
+ /*
1040
+ * call-seq:
1041
+ * Debugger.post_mortem? -> bool
1042
+ *
1043
+ * Returns +true+ if post-moterm debugging is enabled.
1044
+ */
1045
+ static VALUE
1046
+ debug_post_mortem(VALUE self)
1047
+ {
1048
+ return post_mortem;
1049
+ }
1050
+
1051
+ /*
1052
+ * call-seq:
1053
+ * Debugger.post_mortem = bool
1054
+ *
1055
+ * Sets post-moterm flag.
1056
+ * FOR INTERNAL USE ONLY.
1057
+ */
1058
+ static VALUE
1059
+ debug_set_post_mortem(VALUE self, VALUE value)
1060
+ {
1061
+ debug_check_started();
1062
+
1063
+ post_mortem = RTEST(value) ? Qtrue : Qfalse;
1064
+ return value;
1065
+ }
1066
+
1026
1067
  /*
1027
1068
  * call-seq:
1028
1069
  * Debugger.debug_load(file) -> nil
1029
1070
  *
1030
1071
  * Same as Kernel#load but resets current context's frames.
1031
- * FOR INTERNAL USE ONLY.
1072
+ * FOR INTERNAL USE ONLY. Use Debugger.post_mortem method instead.
1032
1073
  */
1033
1074
  static VALUE
1034
1075
  debug_debug_load(VALUE self, VALUE file)
@@ -1556,6 +1597,8 @@ Init_ruby_debug()
1556
1597
  rb_define_module_function(mDebugger, "debug_load", debug_debug_load, 1);
1557
1598
  rb_define_module_function(mDebugger, "skip", debug_skip, 0);
1558
1599
  rb_define_module_function(mDebugger, "debug_at_exit", debug_at_exit, 0);
1600
+ rb_define_module_function(mDebugger, "post_mortem?", debug_post_mortem, 0);
1601
+ rb_define_module_function(mDebugger, "post_mortem=", debug_set_post_mortem, 1);
1559
1602
 
1560
1603
  cThreadsTable = rb_define_class_under(mDebugger, "ThreadsTable", rb_cObject);
1561
1604
 
data/lib/ruby-debug.rb CHANGED
@@ -81,12 +81,13 @@ module Debugger
81
81
  #
82
82
  # Starts a remote debugger.
83
83
  #
84
- def start_remote(host = nil, port = PORT)
84
+ def start_remote(host = nil, port = PORT, post_mortem = false)
85
85
  return if @thread
86
86
  return if started?
87
87
 
88
88
  self.interface = nil
89
89
  start
90
+ self.post_mortem if post_mortem
90
91
 
91
92
  require "socket"
92
93
 
@@ -169,21 +170,23 @@ module Debugger
169
170
  private :stop_main_thread
170
171
 
171
172
  def source_for(file) # :nodoc:
172
- unless File.exists?(file)
173
- return (source == true ? nil : source)
174
- end
175
-
176
- if SCRIPT_LINES__[file].nil? || SCRIPT_LINES__[file] == true
177
- SCRIPT_LINES__[file] = File.readlines(file)
178
- end
179
-
180
- change_time = test(?M, file)
181
- SCRIPT_TIMESTAMPS__[file] ||= change_time
182
- if @reload_source_on_change && SCRIPT_TIMESTAMPS__[file] < change_time
183
- SCRIPT_LINES__[file] = File.readlines(file)
173
+ Dir.chdir File.dirname($0) do
174
+ unless File.exists?(file)
175
+ return (SCRIPT_LINES__[file] == true ? nil : SCRIPT_LINES__[file])
176
+ end
177
+
178
+ if SCRIPT_LINES__[file].nil? || SCRIPT_LINES__[file] == true
179
+ SCRIPT_LINES__[file] = File.readlines(file)
180
+ end
181
+
182
+ change_time = test(?M, file)
183
+ SCRIPT_TIMESTAMPS__[file] ||= change_time
184
+ if @reload_source_on_change && SCRIPT_TIMESTAMPS__[file] < change_time
185
+ SCRIPT_LINES__[file] = File.readlines(file)
186
+ end
187
+
188
+ SCRIPT_LINES__[file]
184
189
  end
185
-
186
- SCRIPT_LINES__[file]
187
190
  end
188
191
 
189
192
  def source_reload
@@ -211,9 +214,58 @@ module Debugger
211
214
  processor = ControlCommandProcessor.new(interface)
212
215
  processor.process_commands
213
216
  end
217
+
218
+ #
219
+ # Activates the post-mortem mode. There are two ways of using it:
220
+ #
221
+ # == Global post-mortem mode
222
+ # By calling Debugger.post_mortem method without a block, you install
223
+ # at_exit hook that intercepts any unhandled by your script exceptions
224
+ # and enables post-mortem mode.
225
+ #
226
+ # == Local post-mortem mode
227
+ #
228
+ # If you know that a particular block of code raises an exception you can
229
+ # enable post-mortem mode by wrapping this block with Debugger.post_mortem, e.g.
230
+ #
231
+ # def offender
232
+ # raise 'error'
233
+ # end
234
+ # Debugger.post_mortem do
235
+ # ...
236
+ # offender
237
+ # ...
238
+ # end
239
+ def post_mortem
240
+ raise "Post-mortem is already activated" if self.post_mortem?
241
+ self.post_mortem = true
242
+ if block_given?
243
+ begin
244
+ yield
245
+ rescue Exception => exp
246
+ handle_post_mortem(exp)
247
+ raise
248
+ ensure
249
+ self.post_mortem = false
250
+ end
251
+ else
252
+ debug_at_exit do
253
+ handle_post_mortem($!) if $! && post_mortem?
254
+ end
255
+ end
256
+ end
257
+
258
+ def handle_post_mortem(exp)
259
+ processor.at_line(nil, exp.__debug_file, exp.__debug_line, exp.__debug_binding, exp.__debug_frames)
260
+ end
261
+ private :handle_post_mortem
214
262
  end
215
263
  end
216
264
 
265
+ class Exception # :nodoc:
266
+ attr_reader :__debug_file, :__debug_line, :__debug_binding, :__debug_frames
267
+ end
268
+
217
269
  module Kernel
218
270
  #
219
271
  # Stops the current thread after a number of _steps_ made.
@@ -10,6 +10,7 @@ module Debugger
10
10
  :control => false,
11
11
  :always_run => false,
12
12
  :unknown => false,
13
+ :context => false,
13
14
  }
14
15
 
15
16
  def inherited(klass)
@@ -29,6 +29,7 @@ module Debugger
29
29
  class InterruptCommand < Command # :nodoc:
30
30
  self.event = false
31
31
  self.control = true
32
+ self.context = true
32
33
 
33
34
  def regexp
34
35
  /^\s*i(?:nterrupt)?\s*$/
@@ -14,7 +14,7 @@ module Debugger
14
14
  end
15
15
 
16
16
  def execute
17
- @state.context.frames.each_with_index do |frame, idx|
17
+ @state.frames.each_with_index do |frame, idx|
18
18
  if idx == @state.frame_pos
19
19
  print "--> "
20
20
  else
@@ -63,11 +63,11 @@ module Debugger
63
63
  @state.frame_pos += (arg ? arg.to_i : 1)
64
64
  end
65
65
  @state.frame_pos = 0 if @state.frame_pos < 0
66
- if @state.frame_pos >= @state.context.frames.size
67
- @state.frame_pos = @state.context.frames.size - 1
66
+ if @state.frame_pos >= @state.frames.size
67
+ @state.frame_pos = @state.frames.size - 1
68
68
  print "At toplevel\n"
69
69
  end
70
- frame = @state.context.frames[@state.frame_pos]
70
+ frame = @state.frames[@state.frame_pos]
71
71
  @state.binding, @state.file, @state.line = frame.binding, frame.file, frame.line
72
72
  print format_frame(frame, @state.frame_pos)
73
73
  end
@@ -105,7 +105,7 @@ module Debugger
105
105
  @state.frame_pos = 0
106
106
  print "At stack bottom\n"
107
107
  end
108
- frame = @state.context.frames[@state.frame_pos]
108
+ frame = @state.frames[@state.frame_pos]
109
109
  @state.binding, @state.file, @state.line = frame.binding, frame.file, frame.line
110
110
  print format_frame(frame, @state.frame_pos)
111
111
  end
@@ -0,0 +1,50 @@
1
+ require 'irb'
2
+ module IRB # :nodoc:
3
+ def self.start_session(binding)
4
+ IRB.setup(nil)
5
+
6
+ workspace = WorkSpace.new(binding)
7
+
8
+ irb = Irb.new(workspace)
9
+
10
+ @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
11
+ @CONF[:MAIN_CONTEXT] = irb.context
12
+
13
+ # trap("SIGINT") do
14
+ # irb.signal_handle
15
+ # end
16
+
17
+ catch(:IRB_EXIT) do
18
+ irb.eval_input
19
+ end
20
+ end
21
+ end
22
+
23
+ module Debugger
24
+ class IRBCommand < Command # :nodoc:
25
+ def regexp
26
+ /^irb$/
27
+ end
28
+
29
+ def execute
30
+ unless @state.interface.kind_of?(LocalInterface)
31
+ print "Command is available only in local mode.\n"
32
+ return
33
+ end
34
+ IRB.start_session(@state.binding)
35
+ end
36
+ end
37
+
38
+ class << self
39
+ def help_command
40
+ 'irb'
41
+ end
42
+
43
+ def help(cmd)
44
+ %{
45
+ irb\tstarts an IRB session. (EXPERIMENTAL)
46
+ }
47
+ end
48
+ end
49
+ end
50
+
@@ -1,11 +1,11 @@
1
1
  module Debugger
2
2
  class ListCommand < Command # :nodoc:
3
3
  def regexp
4
- /^\s*l(?:ist)?(?:\s*(.+))?$/
4
+ /^\s*l(?:ist)?(?:\s*([-=])|\s+(.+))?$/
5
5
  end
6
6
 
7
7
  def execute
8
- if !@match || !@match[1]
8
+ if !@match || !(@match[1] || @match[2])
9
9
  b = @state.previous_line ? @state.previous_line + 10 : @state.line - 5
10
10
  e = b + 9
11
11
  elsif @match[1] == '-'
@@ -15,16 +15,16 @@ module Debugger
15
15
  @state.previous_line = nil
16
16
  b = @state.line - 5
17
17
  e = b + 9
18
- elsif @match[1] == 'on'
18
+ elsif @match[2] == 'on'
19
19
  self.class.always_run = true
20
20
  print "Listing is on.\n"
21
21
  return
22
- elsif @match[1] == 'off'
22
+ elsif @match[2] == 'off'
23
23
  self.class.always_run = false
24
24
  print "Listing is off.\n"
25
25
  return
26
26
  else
27
- b, e = @match[1].split(/[-,]/)
27
+ b, e = @match[2].split(/[-,]/)
28
28
  if e
29
29
  b = b.to_i
30
30
  e = e.to_i
@@ -1,12 +1,14 @@
1
1
  module Debugger
2
2
  class NextCommand < Command # :nodoc:
3
+ self.context = true
4
+
3
5
  def regexp
4
6
  /^\s*n(?:ext)?(?:\s+(\d+))?$/
5
7
  end
6
8
 
7
9
  def execute
8
10
  steps = @match[1] ? @match[1].to_i : 1
9
- @state.context.step_over steps, @state.context.frames.size - @state.frame_pos
11
+ @state.context.step_over steps, @state.frames.size - @state.frame_pos
10
12
  @state.proceed
11
13
  end
12
14
 
@@ -24,6 +26,8 @@ module Debugger
24
26
  end
25
27
 
26
28
  class StepCommand < Command # :nodoc:
29
+ self.context = true
30
+
27
31
  def regexp
28
32
  /^\s*s(?:tep)?(?:\s+(\d+))?$/
29
33
  end
@@ -47,15 +51,17 @@ module Debugger
47
51
  end
48
52
 
49
53
  class FinishCommand < Command # :nodoc:
54
+ self.context = true
55
+
50
56
  def regexp
51
57
  /^\s*fin(?:ish)?$/
52
58
  end
53
59
 
54
60
  def execute
55
- if @state.frame_pos == @state.context.frames.size
61
+ if @state.frame_pos == @state.frames.size
56
62
  print "\"finish\" not meaningful in the outermost frame.\n"
57
63
  else
58
- @state.context.stop_frame = @state.context.frames.size - @state.frame_pos
64
+ @state.context.stop_frame = @state.frames.size - @state.frame_pos
59
65
  @state.frame_pos = 0
60
66
  @state.proceed
61
67
  end
@@ -76,7 +82,7 @@ module Debugger
76
82
 
77
83
  class ContinueCommand < Command # :nodoc:
78
84
  def regexp
79
- /^\s*c(?:ont)?$|^\s*r(?:un)?$/
85
+ /^\s*c(?:ont)?$/
80
86
  end
81
87
 
82
88
  def execute
@@ -85,19 +91,13 @@ module Debugger
85
91
 
86
92
  class << self
87
93
  def help_command
88
- %w|cont run|
94
+ 'cont'
89
95
  end
90
96
 
91
97
  def help(cmd)
92
- if cmd == 'cont'
93
- %{
94
- c[ont]\trun until program ends or hit breakpoint
95
- }
96
- else
97
- %{
98
- r[un]\talias for cont
99
- }
100
- end
98
+ %{
99
+ c[ont]\trun until program ends or hit breakpoint
100
+ }
101
101
  end
102
102
  end
103
103
  end
@@ -47,6 +47,8 @@ module Debugger
47
47
 
48
48
  class ThreadSwitchCommand < Command # :nodoc:
49
49
  self.control = true
50
+ self.context = true
51
+
50
52
  include ThreadFunctions
51
53
 
52
54
  def regexp
@@ -83,6 +85,8 @@ module Debugger
83
85
 
84
86
  class ThreadStopCommand < Command # :nodoc:
85
87
  self.control = true
88
+ self.context = true
89
+
86
90
  include ThreadFunctions
87
91
 
88
92
  def regexp
@@ -118,6 +122,8 @@ module Debugger
118
122
  end
119
123
 
120
124
  class ThreadCurrentCommand < Command # :nodoc:
125
+ self.context = true
126
+
121
127
  include ThreadFunctions
122
128
 
123
129
  def regexp
@@ -143,6 +149,8 @@ module Debugger
143
149
 
144
150
  class ThreadResumeCommand < Command # :nodoc:
145
151
  self.control = true
152
+ self.context = true
153
+
146
154
  include ThreadFunctions
147
155
 
148
156
  def regexp
@@ -8,11 +8,11 @@ module Debugger
8
8
  def execute
9
9
  if @match[1]
10
10
  frm_n = @match[1].to_i
11
- if frm_n > @state.context.frames.size || frm_n == 0
11
+ if frm_n > @state.frames.size || frm_n == 0
12
12
  print "Wrong frame number\n"
13
13
  return
14
14
  end
15
- frame = @state.context.frames[frm_n - 1]
15
+ frame = @state.frames[frm_n - 1]
16
16
  file, line = frame.file, frame.line
17
17
  else
18
18
  file, line = @state.file, @state.line
@@ -61,9 +61,9 @@ module Debugger
61
61
  end
62
62
  protect :at_tracing
63
63
 
64
- def at_line(context, file, line, binding)
64
+ def at_line(context, file, line, binding, frames = context.frames)
65
65
  print "%s:%d: %s", file, line, Debugger.line_at(file, line)
66
- process_commands(context, file, line, binding)
66
+ process_commands(context, file, line, binding, frames)
67
67
  end
68
68
  protect :at_line
69
69
 
@@ -73,7 +73,15 @@ module Debugger
73
73
  @interface.print(*args)
74
74
  end
75
75
 
76
- def process_commands(context, file, line, binding)
76
+ def prompt(context)
77
+ if context
78
+ "(rdb:%d) " % context.thnum
79
+ else
80
+ "(rdb:post-mortem) "
81
+ end
82
+ end
83
+
84
+ def process_commands(context, file, line, binding, frames)
77
85
  event_cmds = Command.commands.select{|cmd| cmd.event }
78
86
  state = State.new do |s|
79
87
  s.context = context
@@ -83,12 +91,14 @@ module Debugger
83
91
  s.display = display
84
92
  s.interface = interface
85
93
  s.commands = event_cmds
94
+ s.frames = frames
86
95
  end
87
96
  commands = event_cmds.map{|cmd| cmd.new(state) }
88
97
  commands.select{|cmd| cmd.class.always_run }.each{|cmd| cmd.execute }
89
98
 
90
- while !state.proceed? and input = @interface.read_command("(rdb:%d) " % context.thnum)
99
+ while !state.proceed? and input = @interface.read_command(prompt(context))
91
100
  catch(:debug_error) do
101
+
92
102
  if input == ""
93
103
  next unless @last_cmd
94
104
  input = @last_cmd
@@ -97,7 +107,11 @@ module Debugger
97
107
  end
98
108
 
99
109
  if cmd = commands.find{ |c| c.match(input) }
100
- cmd.execute
110
+ if context.nil? && cmd.class.context
111
+ print "Command is unavailable\n"
112
+ else
113
+ cmd.execute
114
+ end
101
115
  else
102
116
  unknown_cmd = commands.find{|cmd| cmd.class.unknown }
103
117
  if unknown_cmd
@@ -113,7 +127,7 @@ module Debugger
113
127
  class State # :nodoc:
114
128
  attr_accessor :context, :file, :line, :binding
115
129
  attr_accessor :frame_pos, :previous_line, :display
116
- attr_accessor :interface, :commands
130
+ attr_accessor :interface, :commands, :frames
117
131
 
118
132
  def initialize
119
133
  @frame_pos = 0
data/lib/ruby_debug.so CHANGED
Binary file
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: ruby-debug
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.4.5
7
- date: 2006-12-04 15:26:06 -05:00
6
+ version: "0.5"
7
+ date: 2006-12-20 16:26:41 -05:00
8
8
  summary: Fast Ruby debugger
9
9
  require_paths:
10
10
  - lib
@@ -46,6 +46,7 @@ files:
46
46
  - lib/ruby-debug/commands/eval.rb
47
47
  - lib/ruby-debug/commands/frame.rb
48
48
  - lib/ruby-debug/commands/help.rb
49
+ - lib/ruby-debug/commands/irb.rb
49
50
  - lib/ruby-debug/commands/list.rb
50
51
  - lib/ruby-debug/commands/method.rb
51
52
  - lib/ruby-debug/commands/script.rb