我正在实现一个断点函数,用于在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 :(得分: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
答案 1 :(得分:0)
我修改了sawa的回答:
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=