Project

General

Profile

Actions

Bug #18031

open

Nested TracePoint#enable with define_method target crashes

Added by alanwu (Alan Wu) 5 months ago. Updated 4 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:104548]

Description

Found this crash while looking at tracing related code.
Haven't had time to dig deeper, so I'm making a ticket for now.

one = TracePoint.new(:call) {}
two = TracePoint.new(:call) {}

obj = Object.new
obj.define_singleton_method(:foo) {} # a bmethod

foo = obj.method(:foo)
one.enable(target: foo) do
  two.enable(target: foo) {}
end

It crashes on 2.6.5 and master (a7c85cc).

Updated by jeremyevans0 (Jeremy Evans) 5 months ago

I've submitted a pull request to fix this crash: https://github.com/ruby/ruby/pull/4640

I noticed two other issues:

  1. Tracepoints leak memory. I think this is definitely a bug. Example code:

    loop do
     tp = TracePoint.new(:call){}
     tp.enable
     tp.disable
    end
    
  2. Use multiple tracepoints on the same target ends up with the second tracepoint overwriting the first. So inside the two.enable block in the original code, if you call foo, the one tracepoint isn't called, and after the two.enable block (still inside the one.enable block), neither tracepoint is called. I'm not sure whether this is a bug, but the behavior seems suprising.

Updated by alanwu (Alan Wu) 5 months ago

I don't think the overriding behavior is intentional, since it doesn't happen for other kinds of targets.
There is an existing test case that tests this for Proc.
I also found a leak specific to targeting bmethods while looking at this bug.

Here's my PR to fix these two problems assuming my assessment is right:
https://github.com/ruby/ruby/pull/4651

Actions #3

Updated by alanwu (Alan Wu) 4 months ago

  • Subject changed from Nested TracePoint#enable with target crashes to Nested TracePoint#enable with define_method target crashes
Actions

Also available in: Atom PDF