debug 1.6.3 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,6 +6,22 @@ module DEBUGGER__
6
6
  class SourceRepository
7
7
  include Color
8
8
 
9
+ def file_src iseq
10
+ if (path = (iseq.absolute_path || iseq.path)) && File.exist?(path)
11
+ File.readlines(path, chomp: true)
12
+ end
13
+ end
14
+
15
+ def get iseq
16
+ return unless iseq
17
+
18
+ if CONFIG[:show_evaledsrc]
19
+ orig_src(iseq) || file_src(iseq)
20
+ else
21
+ file_src(iseq) || orig_src(iseq)
22
+ end
23
+ end
24
+
9
25
  if RubyVM.respond_to? :keep_script_lines
10
26
  # Ruby 3.1 and later
11
27
  RubyVM.keep_script_lines = true
@@ -29,17 +45,13 @@ module DEBUGGER__
29
45
  end
30
46
  end
31
47
 
32
- def get iseq
33
- return unless iseq
34
-
35
- if lines = iseq.script_lines&.map(&:chomp)
36
- lines
48
+ def orig_src iseq
49
+ lines = iseq.script_lines&.map(&:chomp)
50
+ line = iseq.first_line
51
+ if line > 1
52
+ lines = [*([''] * (line - 1)), *lines]
37
53
  else
38
- if (path = (iseq.absolute_path || iseq.path)) && File.exist?(path)
39
- File.readlines(path, chomp: true)
40
- else
41
- nil
42
- end
54
+ lines
43
55
  end
44
56
  end
45
57
 
@@ -63,15 +75,22 @@ module DEBUGGER__
63
75
  end
64
76
 
65
77
  def add iseq, src
66
- if (path = (iseq.absolute_path || iseq.path)) && File.exist?(path)
78
+ path = (iseq.absolute_path || iseq.path)
79
+
80
+ if path && File.exist?(path)
67
81
  reloaded = @files.has_key? path
68
- add_path path
69
- return path, reloaded
70
- elsif src
82
+
83
+ if src
84
+ add_iseq iseq, src
85
+ return path, reloaded
86
+ else
87
+ add_path path
88
+ return path, reloaded
89
+ end
90
+ else
71
91
  add_iseq iseq, src
92
+ nil
72
93
  end
73
-
74
- nil
75
94
  end
76
95
 
77
96
  private def all_iseq iseq, rs = []
@@ -87,7 +106,8 @@ module DEBUGGER__
87
106
  if line > 1
88
107
  src = ("\n" * (line - 1)) + src
89
108
  end
90
- si = SrcInfo.new(src.lines)
109
+
110
+ si = SrcInfo.new(src.each_line.map{|l| l.chomp})
91
111
  all_iseq(iseq).each{|e|
92
112
  e.instance_variable_set(:@debugger_si, si)
93
113
  e.freeze
@@ -102,7 +122,7 @@ module DEBUGGER__
102
122
 
103
123
  private def get_si iseq
104
124
  return unless iseq
105
-
125
+
106
126
  if iseq.instance_variable_defined?(:@debugger_si)
107
127
  iseq.instance_variable_get(:@debugger_si)
108
128
  elsif @files.has_key?(path = (iseq.absolute_path || iseq.path))
@@ -112,7 +132,7 @@ module DEBUGGER__
112
132
  end
113
133
  end
114
134
 
115
- def get iseq
135
+ def orig_src iseq
116
136
  if si = get_si(iseq)
117
137
  si.src
118
138
  end
data/lib/debug/start.rb CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  require_relative 'session'
4
4
  return unless defined?(DEBUGGER__)
5
- DEBUGGER__.start
5
+ DEBUGGER__.start no_sigint_hook: false
@@ -18,7 +18,7 @@ module DEBUGGER__
18
18
  module SkipPathHelper
19
19
  def skip_path?(path)
20
20
  !path ||
21
- CONFIG.skip? ||
21
+ DEBUGGER__.skip? ||
22
22
  ThreadClient.current.management? ||
23
23
  skip_internal_path?(path) ||
24
24
  skip_config_skip_path?(path)
@@ -291,8 +291,10 @@ module DEBUGGER__
291
291
  end
292
292
 
293
293
  if event != :pause
294
- show_src
295
- show_frames CONFIG[:show_frames]
294
+ unless bp&.skip_src
295
+ show_src
296
+ show_frames CONFIG[:show_frames]
297
+ end
296
298
 
297
299
  set_mode :waiting
298
300
 
@@ -328,11 +330,15 @@ module DEBUGGER__
328
330
  @step_tp.disable if @step_tp
329
331
 
330
332
  thread = Thread.current
333
+ subsession_id = SESSION.subsession_id
331
334
 
332
335
  if SUPPORT_TARGET_THREAD
333
336
  @step_tp = TracePoint.new(*events){|tp|
334
- next if SESSION.break_at? tp.path, tp.lineno
335
- next if !yield(tp.event)
337
+ if SESSION.stop_stepping? tp.path, tp.lineno, subsession_id
338
+ tp.disable
339
+ next
340
+ end
341
+ next if !yield(tp)
336
342
  next if tp.path.start_with?(__dir__)
337
343
  next if tp.path.start_with?('<internal:trace_point>')
338
344
  next unless File.exist?(tp.path) if CONFIG[:skip_nosrc]
@@ -347,8 +353,11 @@ module DEBUGGER__
347
353
  else
348
354
  @step_tp = TracePoint.new(*events){|tp|
349
355
  next if thread != Thread.current
350
- next if SESSION.break_at? tp.path, tp.lineno
351
- next if !yield(tp.event)
356
+ if SESSION.stop_stepping? tp.path, tp.lineno, subsession_id
357
+ tp.disable
358
+ next
359
+ end
360
+ next if !yield(tp)
352
361
  next if tp.path.start_with?(__dir__)
353
362
  next if tp.path.start_with?('<internal:trace_point>')
354
363
  next unless File.exist?(tp.path) if CONFIG[:skip_nosrc]
@@ -384,15 +393,19 @@ module DEBUGGER__
384
393
  end
385
394
  end
386
395
 
387
- def frame_eval_core src, b
396
+ def frame_eval_core src, b, binding_location: false
388
397
  saved_target_frames = @target_frames
389
398
  saved_current_frame_index = @current_frame_index
390
399
 
391
400
  if b
392
- f, _l = b.source_location
401
+ file, lineno = b.source_location
393
402
 
394
403
  tp_allow_reentry do
395
- b.eval(src, "(rdbg)/#{f}")
404
+ if binding_location
405
+ b.eval(src, file, lineno)
406
+ else
407
+ b.eval(src, "(rdbg)/#{file}")
408
+ end
396
409
  end
397
410
  else
398
411
  frame_self = current_frame.self
@@ -411,16 +424,16 @@ module DEBUGGER__
411
424
  [:return_value, "_return"],
412
425
  ]
413
426
 
414
- def frame_eval src, re_raise: false
427
+ def frame_eval src, re_raise: false, binding_location: false
415
428
  @success_last_eval = false
416
429
 
417
- b = current_frame.eval_binding
430
+ b = current_frame&.eval_binding || TOPLEVEL_BINDING
418
431
 
419
432
  special_local_variables current_frame do |name, var|
420
433
  b.local_variable_set(name, var) if /\%/ !~ name
421
434
  end
422
435
 
423
- result = frame_eval_core(src, b)
436
+ result = frame_eval_core(src, b, binding_location: binding_location)
424
437
 
425
438
  @success_last_eval = true
426
439
  result
@@ -482,19 +495,28 @@ module DEBUGGER__
482
495
  exit!
483
496
  end
484
497
 
485
- def show_src(frame_index: @current_frame_index, update_line: false, max_lines: CONFIG[:show_src_lines], **options)
498
+ def show_src(frame_index: @current_frame_index, update_line: false, ignore_show_line: false, max_lines: CONFIG[:show_src_lines], **options)
486
499
  if frame = get_frame(frame_index)
487
- start_line, end_line, lines = *get_src(frame, max_lines: max_lines, **options)
488
-
489
- if start_line
490
- if update_line
491
- frame.show_line = end_line
500
+ begin
501
+ if ignore_show_line
502
+ prev_show_line = frame.show_line
503
+ frame.show_line = nil
492
504
  end
493
505
 
494
- puts "[#{start_line+1}, #{end_line}] in #{frame.pretty_path}" if !update_line && max_lines != 1
495
- puts lines[start_line...end_line]
496
- else
497
- puts "# No sourcefile available for #{frame.path}"
506
+ start_line, end_line, lines = *get_src(frame, max_lines: max_lines, **options)
507
+
508
+ if start_line
509
+ if update_line
510
+ frame.show_line = end_line
511
+ end
512
+
513
+ puts "[#{start_line+1}, #{end_line}] in #{frame.pretty_path}" if !update_line && max_lines != 1
514
+ puts lines[start_line...end_line]
515
+ else
516
+ puts "# No sourcefile available for #{frame.path}"
517
+ end
518
+ ensure
519
+ frame.show_line = prev_show_line if prev_show_line
498
520
  end
499
521
  end
500
522
  end
@@ -546,27 +568,55 @@ module DEBUGGER__
546
568
  end
547
569
  end
548
570
 
549
- def show_ivars pat
550
- if s = current_frame&.self
551
- M_INSTANCE_VARIABLES.bind_call(s).sort.each{|iv|
552
- value = M_INSTANCE_VARIABLE_GET.bind_call(s, iv)
571
+ def show_ivars pat, expr = nil
572
+ if expr && !expr.empty?
573
+ _self = frame_eval(expr);
574
+ elsif _self = current_frame&.self
575
+ else
576
+ _self = nil
577
+ end
578
+
579
+ if _self
580
+ M_INSTANCE_VARIABLES.bind_call(_self).sort.each{|iv|
581
+ value = M_INSTANCE_VARIABLE_GET.bind_call(_self, iv)
553
582
  puts_variable_info iv, value, pat
554
583
  }
555
584
  end
556
585
  end
557
586
 
558
- def show_consts pat, only_self: false
559
- if s = current_frame&.self
587
+ def iter_consts c, names = {}
588
+ c.constants(false).sort.each{|name|
589
+ next if names.has_key? name
590
+ names[name] = nil
591
+ begin
592
+ value = c.const_get(name)
593
+ rescue Exception => e
594
+ value = e
595
+ end
596
+ yield name, value
597
+ }
598
+ end
599
+
600
+ def get_consts expr = nil, only_self: false, &block
601
+ if expr && !expr.empty?
602
+ _self = frame_eval(expr)
603
+ if M_KIND_OF_P.bind_call(_self, Module)
604
+ iter_consts _self, &block
605
+ return
606
+ else
607
+ raise "#{_self.inspect} (by #{expr}) is not a Module."
608
+ end
609
+ elsif _self = current_frame&.self
560
610
  cs = {}
561
- if M_KIND_OF_P.bind_call(s, Module)
562
- cs[s] = :self
611
+ if M_KIND_OF_P.bind_call(_self, Module)
612
+ cs[_self] = :self
563
613
  else
564
- s = M_CLASS.bind_call(s)
565
- cs[s] = :self unless only_self
614
+ _self = M_CLASS.bind_call(_self)
615
+ cs[_self] = :self unless only_self
566
616
  end
567
617
 
568
618
  unless only_self
569
- s.ancestors.each{|c| break if c == Object; cs[c] = :ancestors}
619
+ _self.ancestors.each{|c| break if c == Object; cs[c] = :ancestors}
570
620
  if b = current_frame&.binding
571
621
  b.eval('::Module.nesting').each{|c| cs[c] = :nesting unless cs.has_key? c}
572
622
  end
@@ -575,16 +625,17 @@ module DEBUGGER__
575
625
  names = {}
576
626
 
577
627
  cs.each{|c, _|
578
- c.constants(false).sort.each{|name|
579
- next if names.has_key? name
580
- names[name] = nil
581
- value = c.const_get(name)
582
- puts_variable_info name, value, pat
583
- }
628
+ iter_consts c, names, &block
584
629
  }
585
630
  end
586
631
  end
587
632
 
633
+ def show_consts pat, expr = nil, only_self: false
634
+ get_consts expr, only_self: only_self do |name, value|
635
+ puts_variable_info name, value, pat
636
+ end
637
+ end
638
+
588
639
  SKIP_GLOBAL_LIST = %i[$= $KCODE $-K $SAFE].freeze
589
640
  def show_globals pat
590
641
  global_variables.sort.each{|name|
@@ -643,7 +694,8 @@ module DEBUGGER__
643
694
  if editor = (ENV['RUBY_DEBUG_EDITOR'] || ENV['EDITOR'])
644
695
  puts "command: #{editor}"
645
696
  puts " path: #{path}"
646
- system(editor, path)
697
+ require 'shellwords'
698
+ system(*Shellwords.split(editor), path)
647
699
  else
648
700
  puts "can not find editor setting: ENV['RUBY_DEBUG_EDITOR'] or ENV['EDITOR']"
649
701
  end
@@ -758,7 +810,7 @@ module DEBUGGER__
758
810
  case args.first
759
811
  when :method
760
812
  klass_name, op, method_name, cond, cmd, path = args[1..]
761
- bp = MethodBreakpoint.new(current_frame.eval_binding, klass_name, op, method_name, cond: cond, command: cmd, path: path)
813
+ bp = MethodBreakpoint.new(current_frame&.eval_binding || TOPLEVEL_BINDING, klass_name, op, method_name, cond: cond, command: cmd, path: path)
762
814
  begin
763
815
  bp.enable
764
816
  rescue NameError => e
@@ -814,6 +866,7 @@ module DEBUGGER__
814
866
  set_mode :waiting if !waiting?
815
867
  cmds = @q_cmd.pop
816
868
  # pp [self, cmds: cmds]
869
+
817
870
  break unless cmds
818
871
  ensure
819
872
  set_mode :running
@@ -831,8 +884,9 @@ module DEBUGGER__
831
884
 
832
885
  case step_type
833
886
  when :in
887
+ iter = iter || 1
834
888
  if @recorder&.replaying?
835
- @recorder.step_forward
889
+ @recorder.step_forward iter
836
890
  raise SuspendReplay
837
891
  else
838
892
  step_tp iter do
@@ -845,6 +899,7 @@ module DEBUGGER__
845
899
  frame = @target_frames.first
846
900
  path = frame.location.absolute_path || "!eval:#{frame.path}"
847
901
  line = frame.location.lineno
902
+ label = frame.location.base_label
848
903
 
849
904
  if frame.iseq
850
905
  frame.iseq.traceable_lines_norec(lines = {})
@@ -856,35 +911,89 @@ module DEBUGGER__
856
911
 
857
912
  depth = @target_frames.first.frame_depth
858
913
 
859
- step_tp iter do
914
+ step_tp iter do |tp|
860
915
  loc = caller_locations(2, 1).first
861
916
  loc_path = loc.absolute_path || "!eval:#{loc.path}"
917
+ loc_label = loc.base_label
918
+ loc_depth = DEBUGGER__.frame_depth - 3
862
919
 
863
- # same stack depth
864
- (DEBUGGER__.frame_depth - 3 <= depth) ||
865
-
866
- # different frame
867
- (next_line && loc_path == path &&
868
- (loc_lineno = loc.lineno) > line &&
869
- loc_lineno <= next_line)
920
+ case
921
+ when loc_depth == depth && loc_label == label
922
+ true
923
+ when loc_depth < depth
924
+ # lower stack depth
925
+ true
926
+ when (next_line &&
927
+ loc_path == path &&
928
+ (loc_lineno = loc.lineno) > line &&
929
+ loc_lineno <= next_line)
930
+ # different frame (maybe block) but the line is before next_line
931
+ true
932
+ end
870
933
  end
871
934
  break
872
935
 
873
936
  when :finish
874
937
  finish_frames = (iter || 1) - 1
875
- goal_depth = @target_frames.first.frame_depth - finish_frames
938
+ frame = @target_frames.first
939
+ goal_depth = frame.frame_depth - finish_frames - (frame.has_return_value ? 1 : 0)
876
940
 
877
941
  step_tp nil, [:return, :b_return] do
878
942
  DEBUGGER__.frame_depth - 3 <= goal_depth ? true : false
879
943
  end
880
944
  break
881
945
 
946
+ when :until
947
+ location = iter&.strip
948
+ frame = @target_frames.first
949
+ depth = frame.frame_depth - (frame.has_return_value ? 1 : 0)
950
+ target_location_label = frame.location.base_label
951
+
952
+ case location
953
+ when nil, /\A(?:(.+):)?(\d+)\z/
954
+ no_loc = !location
955
+ file = $1 || frame.location.path
956
+ line = ($2 || frame.location.lineno + 1).to_i
957
+
958
+ step_tp nil, [:line, :return] do |tp|
959
+ if tp.event == :line
960
+ next false if no_loc && depth < DEBUGGER__.frame_depth - 3
961
+ next false unless tp.path.end_with?(file)
962
+ next false unless tp.lineno >= line
963
+ true
964
+ else
965
+ true if depth >= DEBUGGER__.frame_depth - 3 &&
966
+ caller_locations(2, 1).first.label == target_location_label
967
+ # TODO: imcomplete condition
968
+ end
969
+ end
970
+ else
971
+ pat = location
972
+ if /\A\/(.+)\/\z/ =~ pat
973
+ pat = Regexp.new($1)
974
+ end
975
+
976
+ step_tp nil, [:call, :c_call, :return] do |tp|
977
+ case tp.event
978
+ when :call, :c_call
979
+ true if pat === tp.callee_id.to_s
980
+ else # :return, :b_return
981
+ true if depth >= DEBUGGER__.frame_depth - 3 &&
982
+ caller_locations(2, 1).first.label == target_location_label
983
+ # TODO: imcomplete condition
984
+ end
985
+ end
986
+ end
987
+
988
+ break
989
+
882
990
  when :back
991
+ iter = iter || 1
883
992
  if @recorder&.can_step_back?
884
993
  unless @recorder.backup_frames
885
994
  @recorder.backup_frames = @target_frames
886
995
  end
887
- @recorder.step_back
996
+ @recorder.step_back iter
888
997
  raise SuspendReplay
889
998
  else
890
999
  puts "Can not step back more."
@@ -922,8 +1031,9 @@ module DEBUGGER__
922
1031
  when :call
923
1032
  result = frame_eval(eval_src)
924
1033
  when :irb
1034
+ require 'irb' # prelude's binding.irb doesn't have show_code option
925
1035
  begin
926
- result = frame_eval('binding.irb')
1036
+ result = frame_eval('binding.irb(show_code: false)', binding_location: true)
927
1037
  ensure
928
1038
  # workaround: https://github.com/ruby/debug/issues/308
929
1039
  Reline.prompt_proc = nil if defined? Reline
@@ -988,6 +1098,10 @@ module DEBUGGER__
988
1098
  when :list
989
1099
  show_src(update_line: true, **(args.first || {}))
990
1100
 
1101
+ when :whereami
1102
+ show_src ignore_show_line: true
1103
+ show_frames CONFIG[:show_frames]
1104
+
991
1105
  when :edit
992
1106
  show_by_editor(args.first)
993
1107
 
@@ -1003,11 +1117,13 @@ module DEBUGGER__
1003
1117
 
1004
1118
  when :ivars
1005
1119
  pat = args.shift
1006
- show_ivars pat
1120
+ expr = args.shift
1121
+ show_ivars pat, expr
1007
1122
 
1008
1123
  when :consts
1009
1124
  pat = args.shift
1010
- show_consts pat
1125
+ expr = args.shift
1126
+ show_consts pat, expr
1011
1127
 
1012
1128
  when :globals
1013
1129
  pat = args.shift
@@ -1093,6 +1209,8 @@ module DEBUGGER__
1093
1209
  end
1094
1210
  event! :result, nil
1095
1211
 
1212
+ when :quit
1213
+ sleep # wait for SystemExit
1096
1214
  when :dap
1097
1215
  process_dap args
1098
1216
  when :cdp
@@ -1107,6 +1225,8 @@ module DEBUGGER__
1107
1225
  rescue Exception => e
1108
1226
  pp ["DEBUGGER Exception: #{__FILE__}:#{__LINE__}", e, e.backtrace]
1109
1227
  raise
1228
+ ensure
1229
+ @returning = false
1110
1230
  end
1111
1231
 
1112
1232
  def debug_event(ev, args)
@@ -1187,12 +1307,18 @@ module DEBUGGER__
1187
1307
  @tp_recorder.enabled?
1188
1308
  end
1189
1309
 
1190
- def step_back
1191
- @index += 1
1310
+ def step_back iter
1311
+ @index += iter
1312
+ if @index > @log.size
1313
+ @index = @log.size
1314
+ end
1192
1315
  end
1193
1316
 
1194
- def step_forward
1195
- @index -= 1
1317
+ def step_forward iter
1318
+ @index -= iter
1319
+ if @index < 0
1320
+ @index = 0
1321
+ end
1196
1322
  end
1197
1323
 
1198
1324
  def step_reset
data/lib/debug/tracer.rb CHANGED
File without changes
data/lib/debug/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DEBUGGER__
4
- VERSION = "1.6.3"
4
+ VERSION = "1.7.0"
5
5
  end
data/lib/debug.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'debug/session'
4
- return unless defined?(DEBUGGER__)
5
- DEBUGGER__::start no_sigint_hook: true, nonstop: true
3
+ if ENV['RUBY_DEBUG_LAZY']
4
+ require_relative 'debug/prelude'
5
+ else
6
+ require_relative 'debug/session'
7
+ return unless defined?(DEBUGGER__)
8
+ DEBUGGER__::start no_sigint_hook: true, nonstop: true
9
+ end
data/misc/README.md.erb CHANGED
@@ -498,7 +498,8 @@ There are additional features:
498
498
  * `<expr>` without debug command is almost same as `pp <expr>`.
499
499
  * If the input line `<expr>` does *NOT* start with any debug command, the line `<expr>` will be evaluated as a Ruby expression and the result will be printed with `pp` method. So that the input `foo.bar` is same as `pp foo.bar`.
500
500
  * If `<expr>` is recognized as a debug command, of course it is not evaluated as a Ruby expression, but is executed as debug command. For example, you can not evaluate such single letter local variables `i`, `b`, `n`, `c` because they are single letter debug commands. Use `p i` instead.
501
- * `Enter` without any input repeats the last command (useful when repeating `step`s).
501
+ * So the author (Koichi Sasada) recommends to use `p`, `pp` or `eval` command to evaluate the Ruby expression everytime.
502
+ * `Enter` without any input repeats the last command (useful when repeating `step`s) for some commands.
502
503
  * `Ctrl-D` is equal to `quit` command.
503
504
  * [debug command compare sheet - Google Sheets](https://docs.google.com/spreadsheets/d/1TlmmUDsvwK4sSIyoMv-io52BUUz__R5wpu-ComXlsw0/edit?usp=sharing)
504
505
 
@@ -567,11 +568,11 @@ It is useful if you only want to call a debug command and don't want to stop the
567
568
  ```
568
569
  def initialize
569
570
  @a = 1
570
- binding.b do: 'watch @a'
571
+ binding.b do: 'info \n watch @a'
571
572
  end
572
573
  ```
573
574
 
574
- On this case, register a watch breakpoint for `@a` and continue to run.
575
+ On this case, execute the `info` command then register a watch breakpoint for `@a` and continue to run. You can also use `;;` instead of `\n` to separate your commands.
575
576
 
576
577
  If `pre: 'command'` is specified, the debugger suspends the program and run the `command` as a debug command, and keep suspend.
577
578
  It is useful if you have operations before suspend.
@@ -591,6 +592,11 @@ On this case, you can see the result of `bar()` every time you stop there.
591
592
  <%= `exe/rdbg --help` %>
592
593
  ```
593
594
 
595
+ # Additional Resources
596
+
597
+ - [From byebug to ruby/debug](https://st0012.dev/from-byebug-to-ruby-debug) by Stan Lo - A migration guide for `byebug` users.
598
+ - [ruby/debug cheatsheet](https://st0012.dev/ruby-debug-cheatsheet) by Stan Lo
599
+
594
600
  # Contributing
595
601
 
596
602
  Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/debug.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: debug
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.3
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koichi Sasada
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-24 00:00:00.000000000 Z
11
+ date: 2022-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: irb
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.3.6
19
+ version: 1.5.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.3.6
26
+ version: 1.5.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: reline
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -60,6 +60,7 @@ files:
60
60
  - ext/debug/extconf.rb
61
61
  - ext/debug/iseq_collector.c
62
62
  - lib/debug.rb
63
+ - lib/debug/abbrev_command.rb
63
64
  - lib/debug/breakpoint.rb
64
65
  - lib/debug/client.rb
65
66
  - lib/debug/color.rb