mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
ext/objspace/lib/objspace/trace.rb: Added
This file, when require'ed, starts tracing the object allocations, and redefines `Kernel#p` to show the allocation site. This commit is experimental; the library name and APIs may change. [Feature #17762]
This commit is contained in:
parent
7cf90f99f5
commit
cf1e1879f1
2 changed files with 60 additions and 0 deletions
44
ext/objspace/lib/objspace/trace.rb
Normal file
44
ext/objspace/lib/objspace/trace.rb
Normal file
|
@ -0,0 +1,44 @@
|
|||
# This is a simple tool to enable the object allocation tracer.
|
||||
# When you have an object of unknown provenance, you can use this
|
||||
# to investigate where the object in question is created.
|
||||
#
|
||||
# = Important notice
|
||||
#
|
||||
# This is only for debugging purpose. Do not use this in production.
|
||||
# Require'ing this file immediately starts tracing the object allocation,
|
||||
# which brings a large performance overhead.
|
||||
#
|
||||
# = Usage
|
||||
#
|
||||
# 1. Add `require "objspace/trace"` into your code (or add `-robjspace/trace` into the command line)
|
||||
# 2. `p obj` will show the allocation site of `obj`
|
||||
#
|
||||
# Note: This redefines `Kernel#p` method, but not `Object#inspect`.
|
||||
#
|
||||
# = Examples
|
||||
#
|
||||
# 1: require "objspace/trace"
|
||||
# 2:
|
||||
# 3: obj = "str"
|
||||
# 4:
|
||||
# 5: p obj #=> "str" @ test.rb:3
|
||||
|
||||
require 'objspace.so'
|
||||
|
||||
module Kernel
|
||||
define_method(:p) do |*objs|
|
||||
objs.each do |obj|
|
||||
file = ObjectSpace.allocation_sourcefile(obj)
|
||||
line = ObjectSpace.allocation_sourceline(obj)
|
||||
if file
|
||||
puts "#{ obj.inspect } @ #{ file }:#{ line }"
|
||||
else
|
||||
puts obj.inspect
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ObjectSpace.trace_object_allocations_start
|
||||
|
||||
warn "objspace/trace is enabled"
|
|
@ -616,4 +616,20 @@ class TestObjSpace < Test::Unit::TestCase
|
|||
assert_not_include ObjectSpace.dump(Class.new), '"name"'
|
||||
assert_not_include ObjectSpace.dump(Module.new), '"name"'
|
||||
end
|
||||
|
||||
def test_objspace_trace
|
||||
assert_in_out_err(%w[-robjspace/trace], "#{<<-"begin;"}\n#{<<-'end;'}") do |out, err|
|
||||
begin;
|
||||
a = "foo"
|
||||
b = "b" + "a" + "r"
|
||||
c = 42
|
||||
p a, b, c
|
||||
end;
|
||||
assert_equal 3, out.size
|
||||
assert_equal '"foo" @ -:2', out[0]
|
||||
assert_equal '"bar" @ -:3', out[1]
|
||||
assert_equal '42', out[2]
|
||||
assert_equal ["objspace/trace is enabled"], err
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue