2012-04-09 21 views
2

私は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) 

私はそれを実行します。

[email protected]:~$ ruby blah.rb 
    line (eval):1      
{:blah=>nil, :rar=>nil} 
    line (eval):2      
{:blah=>4, :rar=>nil} 
[email protected]ualBox:~$ 

これは私が望むものではありません。これはrarへの割り当てを示していません。これを行うより良い方法はありますか?ハックとして、私はevalに最後の文を1つ追加しました。

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

が、それはなど

ループに来るとき、それは私が上で変更変数とそれがためにに変更に並ぶものの出力を取得したいと思い、問題を解決しません。

答えて

1

私は、デバッガの作成や変数割り当てなどの低レベル実行機能のフックに役立つ純粋なルビーの仕組みを知らない。 ruby-debugは深い知識を持ち、実行エンジンにフックするC拡張です。あなたはread it hereです。

+0

お返事ありがとうございます。私の知識はちょっと古くなっていて、何か役に立つものがたくさんありました。 – Anko

関連する問題