我正在尝试用 ruby 编写调试器。每次变量更改时,我都想运行一些代码。我事先不知道变量。
目前我正在尝试 set_trace_func 但它似乎在每一行之前执行,而不是在每一行之后执行,例如;
set_trace_func proc { |event, file, line, id, binding, classname|
if file == "(eval)"
printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
args = binding.eval("local_variables").inject({}) do |vars, name|
value = binding.eval name.to_s
vars[name] = value unless vars.nil?
vars
end
puts args.inspect
end
}
eval("blah = 4\nrar = 3\n")
set_trace_func(nil)
当我执行它时,我得到;
n@VirtualBox:~$ ruby blah.rb
line (eval):1
{:blah=>nil, :rar=>nil}
line (eval):2
{:blah=>4, :rar=>nil}
n@VirtualBox:~$
这不是我想要的 - 它没有显示对 rar 的分配。有一个更好的方法吗?作为 hack,我在 eval 中添加了最后一条语句,例如。
eval("blah = 4\nrar = 3\nnil\n")
但这并不能解决循环等问题。
我想得到一个变量在哪一行更改的输出以及它按顺序更改的内容。