- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我能够使用 TracePoint API 访问 Ruby 方法的参数:
def foo(foo_arg)
end
trace = TracePoint.trace(:call, :c_call) do |tp|
tp.disable
case tp.method_id
when :foo, :sub
method = eval("method(:#{tp.method_id})", tp.binding)
method.parameters.each do |p|
puts "#{p.last}: #{tp.binding.local_variable_get(p.last)}"
end
end
tp.enable
end
trace.enable
foo(10)
# => foo_arg: 10
但是,当我尝试使用 c 方法调用时,出现错误。
"foo".sub(/(f)/) { $1.upcase }
script.rb:20:in `method': undefined method `sub' for class `Object' (NameError)
from script.rb:20:in `<main>'
from script.rb:8:in `eval'
from script.rb:8:in `block in <main>'
from script.rb:20:in `<main>'
这看起来是因为使用 C 方法调用和常规 Ruby 方法调用时返回的绑定(bind)之间存在差异。
在 Ruby 中 tp.self
等于 tp.binding.eval("self")
是 main
但是在 C 中tp.self
是 "foo"
并且 tp.binding.eval("self")
是 main
。对于 Ruby 和 C 定义的方法,有没有办法使用 TracePoint 将参数传递到方法中?
最佳答案
正如您在问题中指出的那样以及在 ruby documentation 中记录的那样, tp.self
返回一个跟踪对象,它有一个你要找的method
方法。我认为你应该使用
method = tp.self.method(tp.method_id)
代替
method = eval("method(:#{tp.method_id})", tp.binding)
更新。关于您所讨论的最后一段的一些解释。 tp.self
在第一种情况下(当你调用 foo
时)指向 main
,因为你定义了 foo
方法在主上下文中,它指向第二种情况下的 String
对象,因为 sub
是在那里定义的。但是 tp.binding.eval("self")
在这两种情况下都返回 main
因为它返回一个调用上下文(不是你期望的“定义”上下文)并且在这两种情况下情况下它是 main
。
更新(回复评论) 我认为唯一的方法是猴子补丁 sub
和您感兴趣的所有其他方法。代码示例:
class String
alias_method :old_sub, :sub
def sub(*args, &block)
old_sub(*args, &block)
end
end
trace = TracePoint.trace(:call, :c_call) do |tp|
tp.disable
case tp.method_id
when :sub
method = tp.self.method(tp.method_id)
puts method.parameters.inspect
end
tp.enable
end
trace.enable
"foo".sub(/(f)/) { |s| s.upcase }
一个很大的缺点是您不能在原始 block 中使用 $1, $2, ...
变量。正如指出的那样here哪里没有办法让它工作。但是,您仍然可以使用 block 参数(在我的示例中为 s
)。
关于ruby - 使用 Ruby 的 TracePoint 获取方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30584454/
我主要使用 C#,我经常使用 TracePoints(设置了“当命中...”的断点)使用 {DateTime.Now.ToString(HH:mm:ss.fff") 打印当前时间}。我知道这不是很准确
目标:每次执行系统调用时打印 Hello。 代码: _kern.c #include #include "bpf_helpers.h" SEC("tracepoint/syscalls/sys_en
我正在尝试在 Ubuntu 16.04 上编译 linux 内核 3.4.0,但出现错误: In file included from kernel/fork.c:79:0: include/trac
我能够使用 TracePoint API 访问 Ruby 方法的参数: def foo(foo_arg) end trace = TracePoint.trace(:call, :c_call) do
我想使用 Tracepoint 跟踪程序中进行的所有方法调用。 Tracepoint 不跟踪对某些类的调用。例如: class A; def call_to_method_a; puts 'test3
我正在尝试弄清楚我是否可以获得在 ruby 2.0 中使用 TracePoint 执行方法所需的时间。感谢您的帮助。 更新 我想澄清一下这个问题。我的目标是获得执行所有方法所需的时间,即使您不知道
我花了一些时间学习如何使用 Dtrace 和 Ruby。然后在 2.0 的 Ruby 核心中找到了新的 TracePoint 类。 TracePoint 是否在幕后使用与 dtrace 用于监视 ru
我是一名优秀的程序员,十分优秀!