2016-05-22 164 views
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,但我希望它也跟蹤到`字符串#大小的叫聲。爲什麼不呢?

回答

3

這是因爲這些方法在C中定義,而不是在Ruby中定義。 :call只跟蹤Ruby定義的方法調用。要跟蹤C定義的方法,您需要使用:c_call

+1

良好的通話,我忘了添加':c_call'作爲參數。我稍微改了一些例子來添加c_call,但是調用'test2'.size仍然沒有顯示Tracepoint的調用。思考? – Lush

+2

你可能想看看生成的代碼。這很可能是因爲字符串的內容和方法調用的目標在編譯時已知(並且'String#size'沒有副作用),編譯器會完全優化掉該調用。畢竟,它是死碼,並沒有任何作用。您沒有指定您使用的是哪個實現,但我知道至少JRuby確實會執行死代碼消除。 –