2012-04-09 2 views
2

나는 루비에서 디버거를 작성하려고합니다. 변수가 바뀔 때마다 코드를 실행하고 싶습니다. 변수를 미리 알지 못합니다.루비에서 변수 변경/할당을 감지하는 방법

현재 나는 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]:~$ 

이것은 내가 원하는 것이 아니며 rar에 할당을 표시하지 않습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 해킹으로 eval에 마지막 문장 하나를 추가했습니다.

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

하지만 루프에 관해서 그래도 문제가 해결되지 않는 등

내가 변수가 변경되고 무엇을 위해 변경 줄 것을의 출력을 좀하고 싶습니다.

답변

1

디버거를 작성하고 변수 할당과 같은 낮은 수준의 실행 기능을 연결하는 데 도움이되는 순수한 루비의 메커니즘을 알지 못합니다. 루비 디버그는 깊은 지식을 가진 C 확장이며 실행 엔진에 연결됩니다. 당신은 read it here 일 수 있습니다.

+0

응답 해 주셔서 감사합니다. 내 지식은 약간 오래된 것이고 나는 그로부터 유용한 것을 얻는데 많은 어려움을 겪고있다. – Anko

관련 문제