2

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 に最後のステートメントを 1 つ追加しました。

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

しかし、ループなどの問題は解決しません。

変数がどの行で変更され、何に変更されたかを順番に出力したいと思います。

4

1 に答える 1

1

デバッガーを作成し、変数の割り当てなどの低レベルの実行機能をフックするのに役立つ純粋なルビーのメカニズムを知りません。ruby-debug は、深い知識と実行エンジンへのフックを備えた C 拡張機能です。ここで読むことができます。

于 2012-04-09T13:32:50.777 に答える