0

我正在实现一个断点函数,用于在 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

4

2 回答 2

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=
于 2013-07-29T17:27:42.480 回答
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
于 2013-07-29T15:38:43.597 回答