From: "ivoanjo (Ivo Anjo)" Date: 2022-11-09T11:19:00+00:00 Subject: [ruby-core:110669] [Ruby master Bug#19114] Calling TracePoint#enable multiple times causes TracePoint to be activated multiple times Issue #19114 has been reported by ivoanjo (Ivo Anjo). ---------------------------------------- Bug #19114: Calling TracePoint#enable multiple times causes TracePoint to be activated multiple times https://bugs.ruby-lang.org/issues/19114 * Author: ivoanjo (Ivo Anjo) * Status: Open * Priority: Normal * ruby -v: ruby 3.2.0preview2 (2022-09-09 master 35cfc9a3bb) [x86_64-darwin20] * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- Howdy ����! I work for Datadog [on the `ddtrace` gem](https://github.com/DataDog/dd-trace-rb) and I found an issue with TracePoint. ### Background For tracking time spent in Garbage Collection on our Ruby profiler, we use a tracepoint. While doing some experiments around our code, I realized that enabling the same `TracePoint` more than once made it trigger multiple times. ### How to reproduce (Ruby version & script) This can be reproduced with any tracepoint: ```ruby puts RUBY_DESCRIPTION puts "Enabling tracepoint" tracepoint = TracePoint.new(:line) { |tp| p [tp.path, tp.lineno, tp.event] }.tap(&:enable) 5.times { tracepoint.enable } puts "Finished!" ``` ### Expectation and result This is the output of the above script: ``` ruby 3.2.0preview2 (2022-09-09 master 35cfc9a3bb) [x86_64-darwin20] Enabling tracepoint ["", 91, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["", 213, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["", 213, :line] ["", 213, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["", 213, :line] ["", 213, :line] ["", 213, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["", 213, :line] ["", 213, :line] ["", 213, :line] ["", 213, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["triggertracepoint.rb", 4, :line] ["", 213, :line] ["", 213, :line] ["", 213, :line] ["", 213, :line] ["", 213, :line] ["triggertracepoint.rb", 5, :line] ["triggertracepoint.rb", 5, :line] ["triggertracepoint.rb", 5, :line] ["triggertracepoint.rb", 5, :line] ["triggertracepoint.rb", 5, :line] ["triggertracepoint.rb", 5, :line] Finished! ``` My expectation is that once enabled, a `TracePoint` fires only once for each event, regardless of how many times `TracePoint#enable` was called. Instead, I see it being called as many times as `#enable` was called. -- https://bugs.ruby-lang.org/ Unsubscribe: