如何检测ruby中的变量/赋值

时间:2012-04-09 06:56:03

标签: ruby

我正在尝试在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的任务。有一个更好的方法吗?作为一个黑客,我在eval中添加了最后一个语句,例如。

eval("blah = 4\nrar = 3\nnil\n")

但是当涉及到循环等时,这并不能解决问题。

我想获得一个变量变化的行的输出以及它按顺序改变的内容。

1 个答案:

答案 0 :(得分:1)

我不知道纯ruby中的一种机制可以帮助您编写调试器并挂钩低级执行功能,例如变量赋值。 ruby-debug是一个C扩展,具有深厚的知识并且可以挂钩到执行引擎。你可以read it here