Skip to content

Commit 52715d3

Browse files
committed
fix: prevent tracer recursion
Avoid capturing the tracer object itself when preparing argument records and disable tracepoints while recording Kernel event hooks. Ensure patches remove aliases when uninstalled and update gem installation test script.
1 parent 82a804d commit 52715d3

File tree

4 files changed

+27
-14
lines changed

4 files changed

+27
-14
lines changed

gems/codetracer-pure-ruby-recorder/lib/codetracer/kernel_patches.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ def self.uninstall(tracer)
5454
alias_method :p, :codetracer_original_p
5555
alias_method :puts, :codetracer_original_puts
5656
alias_method :print, :codetracer_original_print
57+
remove_method :codetracer_original_p
58+
remove_method :codetracer_original_puts
59+
remove_method :codetracer_original_print
5760
end
5861
end
5962
end

gems/codetracer-pure-ruby-recorder/lib/codetracer_pure_ruby_recorder.rb

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,24 @@ def setup_tracepoints
125125

126126
def prepare_args(tp)
127127
args_after_self = tp.parameters.map do |(kind, name)|
128-
value = if tp.binding.nil? || name.nil?
129-
@record.nil_value
130-
else
131-
begin
132-
@record.to_value(tp.binding.local_variable_get(name))
133-
rescue
134-
@record.nil_value
135-
end
136-
end
128+
raw = if tp.binding.nil? || name.nil?
129+
nil
130+
else
131+
begin
132+
tp.binding.local_variable_get(name)
133+
rescue
134+
nil
135+
end
136+
end
137+
138+
value = if raw.nil?
139+
@record.nil_value
140+
elsif raw.equal?(self) || raw.equal?(@record)
141+
@record.raw_obj_value(raw.to_s, raw.class.name)
142+
else
143+
@record.to_value(raw)
144+
end
145+
137146
[name.to_sym, value]
138147
end
139148

@@ -198,6 +207,7 @@ def record_step(tp)
198207
end
199208

200209
def record_event(*args)
210+
disable_tracepoints
201211
if args.length == 2
202212
caller, content = args
203213
begin
@@ -214,6 +224,7 @@ def record_event(*args)
214224
else
215225
raise ArgumentError, "wrong number of arguments"
216226
end
227+
enable_tracepoints
217228
end
218229

219230
def record_exception(tp)

gems/codetracer-pure-ruby-recorder/lib/recorder.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,6 @@ def nil_value
362362
MAX_COUNT = 5000
363363

364364
def to_value(v, depth=10)
365-
codetracer_original_p v
366365
if depth <= 0
367366
return nil_value
368367
end

test/test_tracer.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,13 @@ def run_gem_installation_test(gem_bin, gem_module)
134134
require '#{gem_module}'
135135
recorder = #{recorder_class}.new
136136
puts 'start trace'
137-
# recorder.stop
137+
recorder.stop
138138
puts 'this will not be traced'
139139
recorder.start
140-
# puts 'this will be traced'
140+
puts 'this will be traced'
141141
recorder.stop
142-
# puts 'tracing disabled'
143-
# recorder.flush_trace('#{out_dir_lib}')
142+
puts 'tracing disabled'
143+
recorder.flush_trace('#{out_dir_lib}')
144144
RUBY
145145
script_path = File.join('test', 'tmp', "use_#{gem_bin.tr('-', '_')}.rb")
146146
File.write(script_path, script)

0 commit comments

Comments
 (0)