Ruby TracePoint:如何定义特定的陷阱 class?
Ruby TracePoint: How to trap definition of a specific class?
我正在尝试找出如何使用 Ruby 的 TracePoint API 来捕获特定 class 的定义和随后的重新定义(例如 'Resolv') .我可以使用以下方法捕获 all class 定义:
TracePoint.trace(:class) do |tp|
require 'pry'; binding.pry # for example
end
但是,我无法使用 :class
或 :end
参数对其进行过滤,因此我只能捕获 Resolv
class。 TracePoint
对象有一个 defined_class
属性,但在 class 定义(即 nil
,又名 (main)
)时包含 who is self,而不是 class 其定义即将被处理。我也找不到一种方法来查看正在处理的文件和行。 是一个binding
变量,但它不包含任何变量。
我该怎么做?
我知道的唯一方法是跟踪 所有 class 定义并使用 TracePoint#self
:
过滤它们
TracePoint.new(:end) do |tp|
if tp.self == Resolv
# yay, we are in
# tp.disable # use this to unset a trace point
end
end.enable
我正在尝试找出如何使用 Ruby 的 TracePoint API 来捕获特定 class 的定义和随后的重新定义(例如 'Resolv') .我可以使用以下方法捕获 all class 定义:
TracePoint.trace(:class) do |tp|
require 'pry'; binding.pry # for example
end
但是,我无法使用 :class
或 :end
参数对其进行过滤,因此我只能捕获 Resolv
class。 TracePoint
对象有一个 defined_class
属性,但在 class 定义(即 nil
,又名 (main)
)时包含 who is self,而不是 class 其定义即将被处理。我也找不到一种方法来查看正在处理的文件和行。 是一个binding
变量,但它不包含任何变量。
我该怎么做?
我知道的唯一方法是跟踪 所有 class 定义并使用 TracePoint#self
:
TracePoint.new(:end) do |tp|
if tp.self == Resolv
# yay, we are in
# tp.disable # use this to unset a trace point
end
end.enable