From: SASADA Koichi Date: 2013-12-15T13:24:04+09:00 Subject: [ruby-core:59119] Naming issue about ObjectSpace.trace_object_allocation. Let me ask the method naming issue. * ObjectSpace.allocation_sourcefile * ObjectSpace.allocation_sourceline * ObjectSpace.allocation_class_path * ObjectSpace.allocation_method_id * ObjectSpace.allocation_generation I wroet an article about ObjectSpace.trace_object_allocation in Japanese http://www.atdot.net/~ko1/diary/201312.html#d6 and I tried to translate it into English (the end of this mail). Kou gave me a comment that: "I feel strange about the method name `sourcefile' and `sourceline', because it is not `source_file' and `source_line'". Another gave me a comment that: "Why not `allocated_xxx' instead of `allocation_xxx'?" Give me your comments. * The name of sourcefile and sorceline are based on "rb_sourcefile" and "rb_sourceline". * The name of "allocation" is from "trace_object_allocations" (I want to use same word `allocation'). Thanks, Koichi # bike shed party ---- From Ruby 2.1, we can store object allocation related information with ObjectSpace.trace_object_allocations. Currently, this feature supports to store the following information about "where/when". * Where * file name * line nmber * class name (representing String) * method id * When * GC generation (This is not about "Genrational GC". It is GC.count at allocation) See the code: #### require 'objspace' def where_are_you_from? obj file = ObjectSpace.allocation_sourcefile(obj) line = ObjectSpace.allocation_sourceline(obj) "#{file}:#{line}" if file && line end ObjectSpace.trace_object_allocations{ $a = a = Object.new # created at t.rb:10 b = Object.new # created at t.rb:11 p where_are_you_from?(a) #=> "t.rb:10" p where_are_you_from?(b) #=> "t.rb:11" } c = Object.new # created at t.rb:16 p where_are_you_from?($a) #=> "t.rb:10" p where_are_you_from?(c) #=> nil ObjectSpace.trace_object_allocations_clear p where_are_you_from?($a) #=> nil #### This code generate a ($a) and b objects in block passed to ObjectSpace.trace_object_allocations. You can know file name and line nubmer using `where_are_you_from?()' method with a returning string such as "t.rb:10". When you exit the block, object allocation information is not stored. This is why we can't see the information of the object `c' (simply return nil). Exiting the block, you can see the information about $a, because allocation information are still remained. To clear all allocation tracing information, you can use `ObjectSpace.trace_object_allocations_clear'. After calling this method, you can't see the information about $a. If you can understand allocation information is no longer needed, you can call this method. Information can be ask via the following methods: * Where * file name -> ObjectSpace.allocation_sourcefile * line nmber -> ObjectSpace.allocation_sourceline * class name (representing String) -> ObjectSpace.allocation_class_path * method id -> ObjectSpace.allocation_method_id * When * GC generation -> ObjectSpace.allocation_generation Note that ObjectSpace.trace_object_allocations enables to store information during given block. We have other methods: start tracing with ObjectSpace.trace_object_allocations_start, and stop tracing with ObjectSpace.trace_object_allocations_stop. Therefore, ObjectSpace.trace_object_allocations can be defined as the following code: def ObjectSpace.trace_object_allocations begin ObjectSpace.trace_object_allocations_start yield ensure ObjectSpace.trace_object_allocations_stop end end It is very convinient feature. However, it has disadvantage that the performance of object creation and freeing are very slow. You can use this feature for debugging and profiling. There is another important point. This feature is, in fact, the sample code of using new internal TracePoint API. You can make similar feature using this internal TracePoint API. ---- -- // SASADA Koichi at atdot dot net