2013-07-29 48 views
0

我正在實現一個斷點函數,用於在ruby中調試我的代碼。爲ruby實現斷點函數

我的斷點函數就像下面代碼中的breakpoint一樣。

def breakpoint s 
    color_s = "\033[1m\033[33m" 
    color_f = "\033[0m\033[22m" 
    line= (caller.first.split ":")[1] 
    puts "#{color_s}#{Time.new.strftime("%H:%M:%S")} line:#{line} -- #{s.to_s}#{color_f}" 
    gets 
end 

a = 3 
puts "Hello World" 
breakpoint "test" 

會產生輸出像

Hello World 
19:21:33 line:11 -- test 

關注:line:11是在函數被調用的行號。

我的問題是如何從程序堆棧中獲取變量名稱和值。例如在上面的代碼中:a = 3

+0

是你的 「斷點功能」 看中'puts',或者它實際上應該中斷執行?你爲什麼不用'pry'或'debugger'來代替? – tessi

+0

爲獲得中斷執行而添加'gets'。 – NewMrd

+0

什麼變量名稱和值? – sawa

回答

0

您需要通過當前環境的binding對象來打印局部變量。

def breakpoint s, b 
    b.instance_eval{local_variables.each{|sym| puts "#{sym} = #{eval(sym.to_s)}"}} 
    ... 
end 

a = 3 
breakpoint "test", binding 
+0

錯誤:'eval':不能將符號轉換爲字符串(TypeError)' – NewMrd

+0

?????? ????????? – sawa

+0

'b.instance_eval {local_variables.each {| sym | puts「#{sym}」}}'在函數'breakpoint'中輸出變量名稱 – NewMrd

0

我修改澤圭太的回答是:

def breakpoint s,a 
    color_s = "\033[1m\033[33m" 
    color_f = "\033[0m\033[22m" 
    line= (caller.first.split ":")[1] 
    vars = eval('local_variables',a).map{|v| "#{v.to_s}= #{eval(v.to_s,a)}"}.join ";" 
    puts "#{color_s}#{Time.new.strftime("%H:%M:%S")} line:#{line} -- #{s.to_s} -- #{vars}#{color_f}" 
    gets 
end 

a = 3 
g = 5 
puts "Hello World" 
breakpoint "test",binding 
f = 54 

輸出:

Hello World 
22:58:40 line:13 -- test -- a= 3;g= 5;f=