ruby-debug 0.4.5-mswin32 → 0.5-mswin32

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.
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