diff --git a/ext/objspace/object_tracing.c b/ext/objspace/object_tracing.c index b6ffca8bd3..4973a7535b 100644 --- a/ext/objspace/object_tracing.c +++ b/ext/objspace/object_tracing.c @@ -290,8 +290,12 @@ trace_object_allocations_stop(VALUE self) } if (arg->running == 0) { - rb_tracepoint_disable(arg->newobj_trace); - rb_tracepoint_disable(arg->freeobj_trace); + if (arg->newobj_trace != 0) { + rb_tracepoint_disable(arg->newobj_trace); + } + if (arg->freeobj_trace != 0) { + rb_tracepoint_disable(arg->freeobj_trace); + } } return Qnil; diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb index e47917030a..40f1c73a51 100644 --- a/test/objspace/test_objspace.rb +++ b/test/objspace/test_objspace.rb @@ -164,6 +164,15 @@ class TestObjSpace < Test::Unit::TestCase end; end + def test_trace_object_allocations_stop_first + assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") + begin; + require "objspace" + # Make sure stoping before the tracepoints are initialized doesn't raise. See [Bug #17020] + ObjectSpace.trace_object_allocations_stop + end; + end + def test_trace_object_allocations ObjectSpace.trace_object_allocations_clear # clear object_table to get rid of erroneous detection for c0 Class.name