Ruby 为什么';t tracepoint跟踪对'String#size'等方法的调用?

Ruby 为什么';t tracepoint跟踪对'String#size'等方法的调用?,ruby,Ruby,我想使用Tracepoint跟踪程序中的所有方法调用跟踪点不跟踪对某些类的调用。例如: 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.cal

我想使用
Tracepoint
跟踪程序中的所有方法调用<代码>跟踪点不跟踪对某些类的调用。例如:

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
记录对line
A.new.call_to_method_A的调用,但我希望它也能跟踪对'String#size'的调用。为什么不呢?

这是因为这些方法是用C定义的,而不是用Ruby定义的<代码>:call
仅跟踪Ruby定义的方法调用。要跟踪C定义的方法,您需要使用
:C_call

好的调用,我忘了添加
:C_call
作为参数。我稍微修改了这个示例,添加了c_调用,但是调用了“test2”。size仍然没有按跟踪点显示调用。想法?您可能想看看生成的代码。很可能是因为字符串的内容和方法调用的目标在编译时都是已知的(而且
string#size
没有副作用),所以编译器完全优化了调用。毕竟,它是死代码,没有任何效果。您没有指定使用哪个实现,但我知道至少JRuby执行死代码消除。