debug 1.4.0 → 1.6.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,11 +6,32 @@ require 'pp'
6
6
  require_relative 'color'
7
7
 
8
8
  module DEBUGGER__
9
+ M_INSTANCE_VARIABLES = method(:instance_variables).unbind
10
+ M_INSTANCE_VARIABLE_GET = method(:instance_variable_get).unbind
11
+ M_CLASS = method(:class).unbind
12
+ M_SINGLETON_CLASS = method(:singleton_class).unbind
13
+ M_KIND_OF_P = method(:kind_of?).unbind
14
+ M_RESPOND_TO_P = method(:respond_to?).unbind
15
+ M_METHOD = method(:method).unbind
16
+ M_OBJECT_ID = method(:object_id).unbind
17
+
9
18
  module SkipPathHelper
10
19
  def skip_path?(path)
20
+ !path ||
21
+ CONFIG.skip? ||
22
+ ThreadClient.current.management? ||
23
+ skip_internal_path?(path) ||
24
+ skip_config_skip_path?(path)
25
+ end
26
+
27
+ def skip_config_skip_path?(path)
11
28
  (skip_paths = CONFIG[:skip_path]) && skip_paths.any?{|skip_path| path.match?(skip_path)}
12
29
  end
13
30
 
31
+ def skip_internal_path?(path)
32
+ path.start_with?(__dir__) || path.start_with?('<internal:')
33
+ end
34
+
14
35
  def skip_location?(loc)
15
36
  loc_path = loc.absolute_path || "!eval:#{loc.path}"
16
37
  skip_path?(loc_path)
@@ -30,7 +51,11 @@ module DEBUGGER__
30
51
  include Color
31
52
  include SkipPathHelper
32
53
 
33
- attr_reader :location, :thread, :id, :recorder
54
+ attr_reader :thread, :id, :recorder, :check_bp_fulfillment_map
55
+
56
+ def location
57
+ current_frame&.location
58
+ end
34
59
 
35
60
  def assemble_arguments(args)
36
61
  args.map do |arg|
@@ -42,7 +67,8 @@ module DEBUGGER__
42
67
  call_identifier_str =
43
68
  case frame.frame_type
44
69
  when :block
45
- level, block_loc, args = frame.block_identifier
70
+ level, block_loc = frame.block_identifier
71
+ args = frame.parameters_info
46
72
 
47
73
  if !args.empty?
48
74
  args_str = " {|#{assemble_arguments(args)}|}"
@@ -50,7 +76,8 @@ module DEBUGGER__
50
76
 
51
77
  "#{colorize_blue("block")}#{args_str} in #{colorize_blue(block_loc + level)}"
52
78
  when :method
53
- ci, args = frame.method_identifier
79
+ ci = frame.method_identifier
80
+ args = frame.parameters_info
54
81
 
55
82
  if !args.empty?
56
83
  args_str = "(#{assemble_arguments(args)})"
@@ -87,6 +114,9 @@ module DEBUGGER__
87
114
  @obj_map = {} # { object_id => obj } for CDP
88
115
  @recorder = nil
89
116
  @mode = :waiting
117
+ @current_frame_index = 0
118
+ # every thread should maintain its own CheckBreakpoint fulfillment state
119
+ @check_bp_fulfillment_map = {} # { check_bp => boolean }
90
120
  set_mode :running
91
121
  thr.instance_variable_set(:@__thread_client_id, id)
92
122
 
@@ -106,6 +136,7 @@ module DEBUGGER__
106
136
  end
107
137
 
108
138
  def set_mode mode
139
+ debug_mode(@mode, mode)
109
140
  # STDERR.puts "#{@mode} => #{mode} @ #{caller.inspect}"
110
141
  # pp caller
111
142
 
@@ -149,14 +180,7 @@ module DEBUGGER__
149
180
  end
150
181
 
151
182
  def to_s
152
- loc = current_frame&.location
153
-
154
- if loc
155
- str = "(#{@thread.name || @thread.status})@#{loc}"
156
- else
157
- str = "(#{@thread.name || @thread.status})@#{@thread.to_s}"
158
- end
159
-
183
+ str = "(#{@thread.name || @thread.status})@#{current_frame&.location || @thread.to_s}"
160
184
  str += " (not under control)" unless self.waiting?
161
185
  str
162
186
  end
@@ -176,6 +200,7 @@ module DEBUGGER__
176
200
  end
177
201
 
178
202
  def << req
203
+ debug_cmd(req)
179
204
  @q_cmd << req
180
205
  end
181
206
 
@@ -186,6 +211,7 @@ module DEBUGGER__
186
211
  end
187
212
 
188
213
  def event! ev, *args
214
+ debug_event(ev, args)
189
215
  @q_evt << [self, @output, ev, generate_info, *args]
190
216
  @output = []
191
217
  end
@@ -231,6 +257,7 @@ module DEBUGGER__
231
257
 
232
258
  def suspend event, tp = nil, bp: nil, sig: nil, postmortem_frames: nil, replay_frames: nil, postmortem_exc: nil
233
259
  return if management?
260
+ debug_suspend(event)
234
261
 
235
262
  @current_frame_index = 0
236
263
 
@@ -246,7 +273,6 @@ module DEBUGGER__
246
273
 
247
274
  cf = @target_frames.first
248
275
  if cf
249
- @location = cf.location
250
276
  case event
251
277
  when :return, :b_return, :c_return
252
278
  cf.has_return_value = true
@@ -266,7 +292,7 @@ module DEBUGGER__
266
292
 
267
293
  if event != :pause
268
294
  show_src
269
- show_frames CONFIG[:show_frames] || 2
295
+ show_frames CONFIG[:show_frames]
270
296
 
271
297
  set_mode :waiting
272
298
 
@@ -339,9 +365,45 @@ module DEBUGGER__
339
365
 
340
366
  ## cmd helpers
341
367
 
342
- # this method is extracted to hide frame_eval's local variables from C method eval's binding
343
- def instance_eval_for_cmethod frame_self, src
344
- frame_self.instance_eval(src)
368
+ if TracePoint.respond_to? :allow_reentry
369
+ def tp_allow_reentry
370
+ TracePoint.allow_reentry do
371
+ yield
372
+ end
373
+ rescue RuntimeError => e
374
+ # on the postmortem mode, it is not stopped in TracePoint
375
+ if e.message == 'No need to allow reentrance.'
376
+ yield
377
+ else
378
+ raise
379
+ end
380
+ end
381
+ else
382
+ def tp_allow_reentry
383
+ yield
384
+ end
385
+ end
386
+
387
+ def frame_eval_core src, b
388
+ saved_target_frames = @target_frames
389
+ saved_current_frame_index = @current_frame_index
390
+
391
+ if b
392
+ f, _l = b.source_location
393
+
394
+ tp_allow_reentry do
395
+ b.eval(src, "(rdbg)/#{f}")
396
+ end
397
+ else
398
+ frame_self = current_frame.self
399
+
400
+ tp_allow_reentry do
401
+ frame_self.instance_eval(src)
402
+ end
403
+ end
404
+ ensure
405
+ @target_frames = saved_target_frames
406
+ @current_frame_index = saved_current_frame_index
345
407
  end
346
408
 
347
409
  SPECIAL_LOCAL_VARS = [
@@ -358,16 +420,13 @@ module DEBUGGER__
358
420
  b.local_variable_set(name, var) if /\%/ !~ name
359
421
  end
360
422
 
361
- result = if b
362
- f, _l = b.source_location
363
- b.eval(src, "(rdbg)/#{f}")
364
- else
365
- frame_self = current_frame.self
366
- instance_eval_for_cmethod(frame_self, src)
367
- end
423
+ result = frame_eval_core(src, b)
424
+
368
425
  @success_last_eval = true
369
426
  result
370
427
 
428
+ rescue SystemExit
429
+ raise
371
430
  rescue Exception => e
372
431
  return yield(e) if block_given?
373
432
 
@@ -380,65 +439,97 @@ module DEBUGGER__
380
439
  raise if re_raise
381
440
  end
382
441
 
383
- def show_src(frame_index: @current_frame_index,
384
- update_line: false,
385
- max_lines: CONFIG[:show_src_lines] || 10,
386
- start_line: nil,
387
- end_line: nil,
388
- dir: +1)
389
- if @target_frames && frame = @target_frames[frame_index]
390
- if file_lines = frame.file_lines
391
- frame_line = frame.location.lineno - 1
392
-
393
- lines = file_lines.map.with_index do |e, i|
394
- cur = i == frame_line ? '=>' : ' '
395
- line = colorize_dim('%4d|' % (i+1))
396
- "#{cur}#{line} #{e}"
397
- end
442
+ def get_src(frame,
443
+ max_lines:,
444
+ start_line: nil,
445
+ end_line: nil,
446
+ dir: +1)
447
+ if file_lines = frame.file_lines
448
+ frame_line = frame.location.lineno - 1
449
+
450
+ lines = file_lines.map.with_index do |e, i|
451
+ cur = i == frame_line ? '=>' : ' '
452
+ line = colorize_dim('%4d|' % (i+1))
453
+ "#{cur}#{line} #{e}"
454
+ end
398
455
 
399
- unless start_line
400
- if frame.show_line
401
- if dir > 0
402
- start_line = frame.show_line
403
- else
404
- end_line = frame.show_line - max_lines
405
- start_line = [end_line - max_lines, 0].max
406
- end
456
+ unless start_line
457
+ if frame.show_line
458
+ if dir > 0
459
+ start_line = frame.show_line
407
460
  else
408
- start_line = [frame_line - max_lines/2, 0].max
461
+ end_line = frame.show_line - max_lines
462
+ start_line = [end_line - max_lines, 0].max
409
463
  end
464
+ else
465
+ start_line = [frame_line - max_lines/2, 0].max
410
466
  end
467
+ end
411
468
 
412
- unless end_line
413
- end_line = [start_line + max_lines, lines.size].min
414
- end
469
+ unless end_line
470
+ end_line = [start_line + max_lines, lines.size].min
471
+ end
415
472
 
473
+ if start_line != end_line && max_lines
474
+ [start_line, end_line, lines]
475
+ end
476
+ else # no file lines
477
+ nil
478
+ end
479
+ rescue Exception => e
480
+ p e
481
+ pp e.backtrace
482
+ exit!
483
+ end
484
+
485
+ def show_src(frame_index: @current_frame_index, update_line: false, max_lines: CONFIG[:show_src_lines], **options)
486
+ 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
416
490
  if update_line
417
491
  frame.show_line = end_line
418
492
  end
419
493
 
420
- if start_line != end_line && max_lines
421
- puts "[#{start_line+1}, #{end_line}] in #{frame.pretty_path}" if !update_line && max_lines != 1
422
- puts lines[start_line ... end_line]
423
- end
424
- else # no file lines
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
425
497
  puts "# No sourcefile available for #{frame.path}"
426
498
  end
427
499
  end
428
- rescue Exception => e
429
- p e
430
- pp e.backtrace
431
- exit!
432
500
  end
433
501
 
434
502
  def current_frame
503
+ get_frame(@current_frame_index)
504
+ end
505
+
506
+ def get_frame(index)
435
507
  if @target_frames
436
- @target_frames[@current_frame_index]
508
+ @target_frames[index]
437
509
  else
438
510
  nil
439
511
  end
440
512
  end
441
513
 
514
+ def collect_locals(frame)
515
+ locals = []
516
+
517
+ if s = frame&.self
518
+ locals << ["%self", s]
519
+ end
520
+ special_local_variables frame do |name, val|
521
+ locals << [name, val]
522
+ end
523
+
524
+ if vars = frame&.local_variables
525
+ vars.each{|var, val|
526
+ locals << [var, val]
527
+ }
528
+ end
529
+
530
+ locals
531
+ end
532
+
442
533
  ## cmd: show
443
534
 
444
535
  def special_local_variables frame
@@ -450,24 +541,15 @@ module DEBUGGER__
450
541
  end
451
542
 
452
543
  def show_locals pat
453
- if s = current_frame&.self
454
- puts_variable_info '%self', s, pat
455
- end
456
- special_local_variables current_frame do |name, val|
457
- puts_variable_info name, val, pat
458
- end
459
-
460
- if vars = current_frame&.local_variables
461
- vars.each{|var, val|
462
- puts_variable_info var, val, pat
463
- }
544
+ collect_locals(current_frame).each do |var, val|
545
+ puts_variable_info(var, val, pat)
464
546
  end
465
547
  end
466
548
 
467
549
  def show_ivars pat
468
550
  if s = current_frame&.self
469
- s.instance_variables.sort.each{|iv|
470
- value = s.instance_variable_get(iv)
551
+ M_INSTANCE_VARIABLES.bind_call(s).sort.each{|iv|
552
+ value = M_INSTANCE_VARIABLE_GET.bind_call(s, iv)
471
553
  puts_variable_info iv, value, pat
472
554
  }
473
555
  end
@@ -476,10 +558,10 @@ module DEBUGGER__
476
558
  def show_consts pat, only_self: false
477
559
  if s = current_frame&.self
478
560
  cs = {}
479
- if s.kind_of? Module
561
+ if M_KIND_OF_P.bind_call(s, Module)
480
562
  cs[s] = :self
481
563
  else
482
- s = s.class
564
+ s = M_CLASS.bind_call(s)
483
565
  cs[s] = :self unless only_self
484
566
  end
485
567
 
@@ -517,7 +599,7 @@ module DEBUGGER__
517
599
  return if pat && pat !~ label
518
600
 
519
601
  begin
520
- inspected = obj.inspect
602
+ inspected = DEBUGGER__.safe_inspect(obj)
521
603
  rescue Exception => e
522
604
  inspected = e.inspect
523
605
  end
@@ -526,28 +608,32 @@ module DEBUGGER__
526
608
  w = SESSION::width
527
609
 
528
610
  if mono_info.length >= w
529
- info = truncate(mono_info, width: w)
611
+ maximum_value_width = w - "#{label} = ".length
612
+ valstr = truncate(inspected, width: maximum_value_width)
530
613
  else
531
614
  valstr = colored_inspect(obj, width: 2 ** 30)
532
615
  valstr = inspected if valstr.lines.size > 1
533
- info = "#{colorize_cyan(label)} = #{valstr}"
534
616
  end
535
617
 
618
+ info = "#{colorize_cyan(label)} = #{valstr}"
619
+
536
620
  puts info
537
621
  end
538
622
 
539
623
  def truncate(string, width:)
540
- str = string[0 .. (width-4)] + '...'
541
- str += ">" if str.start_with?("#<")
542
- str
624
+ if string.start_with?("#<")
625
+ string[0 .. (width-5)] + '...>'
626
+ else
627
+ string[0 .. (width-4)] + '...'
628
+ end
543
629
  end
544
630
 
545
631
  ### cmd: show edit
546
632
 
547
633
  def show_by_editor path = nil
548
634
  unless path
549
- if @target_frames && frame = @target_frames[@current_frame_index]
550
- path = frame.path
635
+ if current_frame
636
+ path = current_frame.path
551
637
  else
552
638
  return # can't get path
553
639
  end
@@ -572,15 +658,11 @@ module DEBUGGER__
572
658
  if @target_frames && (max ||= @target_frames.size) > 0
573
659
  frames = []
574
660
  @target_frames.each_with_index{|f, i|
575
- next if pattern && !(f.name.match?(pattern) || f.location_str.match?(pattern))
576
- next if CONFIG[:skip_path] && CONFIG[:skip_path].any?{|pat|
577
- case pat
578
- when String
579
- f.location_str.start_with?(pat)
580
- when Regexp
581
- f.location_str.match?(pat)
582
- end
583
- }
661
+ # we need to use FrameInfo#matchable_location because #location_str is for display
662
+ # and it may change based on configs (e.g. use_short_path)
663
+ next if pattern && !(f.name.match?(pattern) || f.matchable_location.match?(pattern))
664
+ # avoid using skip_path? because we still want to display internal frames
665
+ next if skip_config_skip_path?(f.matchable_location)
584
666
 
585
667
  frames << [i, f]
586
668
  }
@@ -617,18 +699,25 @@ module DEBUGGER__
617
699
  o = Output.new(@output)
618
700
 
619
701
  locals = current_frame&.local_variables
620
- klass = (obj.class == Class || obj.class == Module ? obj : obj.class)
621
702
 
622
- o.dump("constants", obj.constants) if obj.respond_to?(:constants)
703
+ klass = M_CLASS.bind_call(obj)
704
+ klass = obj if Class == klass || Module == klass
705
+
706
+ o.dump("constants", obj.constants) if M_RESPOND_TO_P.bind_call(obj, :constants)
623
707
  outline_method(o, klass, obj)
624
- o.dump("instance variables", obj.instance_variables)
708
+ o.dump("instance variables", M_INSTANCE_VARIABLES.bind_call(obj))
625
709
  o.dump("class variables", klass.class_variables)
626
710
  o.dump("locals", locals.keys) if locals
627
711
  end
628
712
  end
629
713
 
630
714
  def outline_method(o, klass, obj)
631
- singleton_class = begin obj.singleton_class; rescue TypeError; nil end
715
+ begin
716
+ singleton_class = M_SINGLETON_CLASS.bind_call(obj)
717
+ rescue TypeError
718
+ singleton_class = nil
719
+ end
720
+
632
721
  maps = class_method_map((singleton_class || klass).ancestors)
633
722
  maps.each do |mod, methods|
634
723
  name = mod == singleton_class ? "#{klass}.methods" : "#{mod}#methods"
@@ -648,6 +737,23 @@ module DEBUGGER__
648
737
 
649
738
  ## cmd: breakpoint
650
739
 
740
+ # TODO: support non-ASCII Constant name
741
+ def constant_name? name
742
+ case name
743
+ when /\A::\b/
744
+ constant_name? $~.post_match
745
+ when /\A[A-Z]\w*/
746
+ post = $~.post_match
747
+ if post.empty?
748
+ true
749
+ else
750
+ constant_name? post
751
+ end
752
+ else
753
+ false
754
+ end
755
+ end
756
+
651
757
  def make_breakpoint args
652
758
  case args.first
653
759
  when :method
@@ -655,9 +761,24 @@ module DEBUGGER__
655
761
  bp = MethodBreakpoint.new(current_frame.eval_binding, klass_name, op, method_name, cond: cond, command: cmd, path: path)
656
762
  begin
657
763
  bp.enable
764
+ rescue NameError => e
765
+ if bp.klass
766
+ puts "Unknown method name: \"#{e.name}\""
767
+ else
768
+ # klass_name can not be evaluated
769
+ if constant_name? klass_name
770
+ puts "Unknown constant name: \"#{e.name}\""
771
+ else
772
+ # only Class name is allowed
773
+ puts "Not a constant name: \"#{klass_name}\""
774
+ bp = nil
775
+ end
776
+ end
777
+
778
+ Session.activate_method_added_trackers if bp
658
779
  rescue Exception => e
659
- puts e.message
660
- ::DEBUGGER__::METHOD_ADDED_TRACKER.enable
780
+ puts e.inspect
781
+ bp = nil
661
782
  end
662
783
 
663
784
  bp
@@ -853,6 +974,7 @@ module DEBUGGER__
853
974
  else
854
975
  raise "unsupported frame operation: #{arg.inspect}"
855
976
  end
977
+
856
978
  event! :result, nil
857
979
 
858
980
  when :show
@@ -929,7 +1051,7 @@ module DEBUGGER__
929
1051
  begin
930
1052
  obj = frame_eval args.shift, re_raise: true
931
1053
  opt = args.shift
932
- obj_inspect = obj.inspect
1054
+ obj_inspect = DEBUGGER__.safe_inspect(obj)
933
1055
 
934
1056
  width = 50
935
1057
 
@@ -937,7 +1059,7 @@ module DEBUGGER__
937
1059
  obj_inspect = truncate(obj_inspect, width: width)
938
1060
  end
939
1061
 
940
- event! :result, :trace_pass, obj.object_id, obj_inspect, opt
1062
+ event! :result, :trace_pass, M_OBJECT_ID.bind_call(obj), obj_inspect, opt
941
1063
  rescue => e
942
1064
  puts e.message
943
1065
  event! :result, nil
@@ -954,8 +1076,8 @@ module DEBUGGER__
954
1076
  # enable recording
955
1077
  if !@recorder
956
1078
  @recorder = Recorder.new
957
- @recorder.enable
958
1079
  end
1080
+ @recorder.enable
959
1081
  when :off
960
1082
  if @recorder&.enabled?
961
1083
  @recorder.disable
@@ -987,6 +1109,33 @@ module DEBUGGER__
987
1109
  raise
988
1110
  end
989
1111
 
1112
+ def debug_event(ev, args)
1113
+ DEBUGGER__.debug{
1114
+ args = args.map { |arg| DEBUGGER__.safe_inspect(arg) }
1115
+ "#{inspect} sends Event { type: #{ev.inspect}, args: #{args} } to Session"
1116
+ }
1117
+ end
1118
+
1119
+ def debug_mode(old_mode, new_mode)
1120
+ DEBUGGER__.debug{
1121
+ "#{inspect} changes mode (#{old_mode} -> #{new_mode})"
1122
+ }
1123
+ end
1124
+
1125
+ def debug_cmd(cmds)
1126
+ DEBUGGER__.debug{
1127
+ cmd, *args = *cmds
1128
+ args = args.map { |arg| DEBUGGER__.safe_inspect(arg) }
1129
+ "#{inspect} receives Cmd { type: #{cmd.inspect}, args: #{args} } from Session"
1130
+ }
1131
+ end
1132
+
1133
+ def debug_suspend(event)
1134
+ DEBUGGER__.debug{
1135
+ "#{inspect} is suspended for #{event.inspect}"
1136
+ }
1137
+ end
1138
+
990
1139
  class Recorder
991
1140
  attr_reader :log, :index
992
1141
  attr_accessor :backup_frames
@@ -1001,8 +1150,8 @@ module DEBUGGER__
1001
1150
 
1002
1151
  @tp_recorder ||= TracePoint.new(:line){|tp|
1003
1152
  next unless Thread.current == thread
1004
- next if tp.path.start_with? __dir__
1005
- next if tp.path.start_with? '<internal:'
1153
+ # can't be replaced by skip_location
1154
+ next if skip_internal_path?(tp.path)
1006
1155
  loc = caller_locations(1, 1).first
1007
1156
  next if skip_location?(loc)
1008
1157
 
data/lib/debug/tracer.rb CHANGED
@@ -66,15 +66,7 @@ module DEBUGGER__
66
66
  end
67
67
 
68
68
  def skip? tp
69
- if tp.path.start_with?(__dir__) ||
70
- tp.path.start_with?('<internal:') ||
71
- ThreadClient.current.management? ||
72
- skip_path?(tp.path) ||
73
- skip_with_pattern?(tp)
74
- true
75
- else
76
- false
77
- end
69
+ ThreadClient.current.management? || skip_path?(tp.path) || skip_with_pattern?(tp)
78
70
  end
79
71
 
80
72
  def skip_with_pattern?(tp)
@@ -82,18 +74,20 @@ module DEBUGGER__
82
74
  end
83
75
 
84
76
  def out tp, msg = nil, depth = caller.size - 1
85
- location_str = colorize("#{tp.path}:#{tp.lineno}", [:GREEN])
77
+ location_str = colorize("#{FrameInfo.pretty_path(tp.path)}:#{tp.lineno}", [:GREEN])
86
78
  buff = "#{header(depth)}#{msg} at #{location_str}"
87
79
 
88
80
  if false # TODO: Ractor.main?
89
81
  ThreadClient.current.on_trace self.object_id, buff
90
82
  else
91
83
  @output.puts buff
84
+ @output.flush
92
85
  end
93
86
  end
94
87
 
95
88
  def puts msg
96
89
  @output.puts msg
90
+ @output.flush
97
91
  end
98
92
 
99
93
  def minfo tp
@@ -125,7 +119,6 @@ module DEBUGGER__
125
119
  next if skip?(tp)
126
120
 
127
121
  depth = caller.size
128
- sp = ' ' * depth
129
122
 
130
123
  call_identifier_str =
131
124
  if tp.defined_class
@@ -139,9 +132,11 @@ module DEBUGGER__
139
132
  case tp.event
140
133
  when :call, :c_call, :b_call
141
134
  depth += 1 if tp.event == :c_call
135
+ sp = ' ' * depth
142
136
  out tp, ">#{sp}#{call_identifier_str}", depth
143
137
  when :return, :c_return, :b_return
144
138
  depth += 1 if tp.event == :c_return
139
+ sp = ' ' * depth
145
140
  return_str = colorize_magenta(DEBUGGER__.safe_inspect(tp.return_value, short: true))
146
141
  out tp, "<#{sp}#{call_identifier_str} #=> #{return_str}", depth
147
142
  end
@@ -191,7 +186,7 @@ module DEBUGGER__
191
186
  @tracer = TracePoint.new(:a_call){|tp|
192
187
  next if skip?(tp)
193
188
 
194
- if tp.self.object_id == @obj_id
189
+ if M_OBJECT_ID.bind_call(tp.self) == @obj_id
195
190
  klass = tp.defined_class
196
191
  method = tp.method_id
197
192
  method_info =
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.4.0"
4
+ VERSION = "1.6.1"
5
5
  end