Har*_*tor 3 ruby debugging verbose
我想做一件简单的事情,但我找不到办法去做。我只想在控制台中观看我的 ruby 代码的执行流程。例如,如果我有这个:
def process
hash = {a:1,b:2}
hash.values.map!{|e| e+1}
end
Run Code Online (Sandbox Code Playgroud)
当我输入时,我想在控制台中看到类似的内容process:
hash = {a:1,b:2}
=> {:a=>1, :b=>2}
hash.values.map!{|e| e+1}
=> [2, 3]
Run Code Online (Sandbox Code Playgroud)
有没有一种有用的方法来做这样的事情?
$VERBOSE似乎没有做任何事情,而且$DEBUG似乎相反,太冗长了。
您正在谈论“跟踪”功能。
某些语言,如 shell 和 good-ol' GWBasic,有一个标志来显示它们当前正在执行的行。Ruby 的$DEBUG输出可能会让您充斥信息过载,不是来自您的代码,而是来自任何寻找它并转储其当前状态或打开其跟踪的 gem。
许多人在他们的代码中撒上puts一些东西,以便在他们的开发/测试过程中显示他们所在位置的一些指示符。如果你这样做,我建议你把它写成一种方法来限制你的输出,让你轻松地打开/关闭它。此外,使用标志来检查您是否要调试。您甚至可能希望使用 OptionParser 来创建一个--debug标志以在命令行上传递。使用方法的另一个很好的副作用是很容易将输出重定向到一个文件,你可以tail在输出时观察它,然后用于分类。
另一种选择是将代码加载到调试器中并告诉它进行跟踪。你会看到代码的每一步,很冗长,但细节很好。您还可以告诉它运行到某些点,以便您可以查看代码并四处挖掘,如果需要,可以进入 IRB。
就我个人而言,作为老派,并且在汇编语言方面有所了解,我对调试器很满意,所以我经常使用 Ruby。告诉它运行到某个位置并停止很容易,或者您可以嵌入include 'debugger'; debugger到您的代码中,它会在该点停止。一旦到达那里,就可以看到发生了什么,然后c继续,让程序运行直到它debugger再次命中该语句。我发现调试器非常强大,是一个很好的选择性放大镜,在我想知道发生了什么的时候。
“在 Ruby 中调试”有很多不错的技巧,您可能也会觉得有用。
编辑:
我喜欢 Alex D 建议查看 Ruby 的set_trace_func. 我没有使用过它(坦率地说忘记了),但这是在应用程序中设置良好跟踪的好方法。使用一些代码,您可以设置打开/关闭它并有选择地输出给定的某个类或条件,因为您可以控制proc被调用。