2
我想使用Tracepoint
來跟蹤程序中的所有方法調用。 Tracepoint
不會跟蹤對某些類的調用。例如:爲什麼不跟蹤跟蹤調用方法像「String#size」?
class A; def call_to_method_a; puts 'test3' end; end
TracePoint.trace(:call, :c_call) do |tp|
p [tp.lineno, tp.defined_class, tp.method_id, tp.event]
end
'test2'.size
# No Tracepoint output
A.new.call_to_method_a
# [26, A, :call_to_method_a, :call]
Tracepoint
記錄通話線路A.new.call_to_method_a
,但我希望它也跟蹤到`字符串#大小的叫聲。爲什麼不呢?
良好的通話,我忘了添加':c_call'作爲參數。我稍微改了一些例子來添加c_call,但是調用'test2'.size仍然沒有顯示Tracepoint的調用。思考? – Lush
你可能想看看生成的代碼。這很可能是因爲字符串的內容和方法調用的目標在編譯時已知(並且'String#size'沒有副作用),編譯器會完全優化掉該調用。畢竟,它是死碼,並沒有任何作用。您沒有指定您使用的是哪個實現,但我知道至少JRuby確實會執行死代碼消除。 –