为ruby实现断点功能

时间:2013-07-29 15:02:44

标签: ruby debugging breakpoints callstack

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

2 个答案:

答案 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=