如何跟踪ruby程序的执行过程

Posted

技术标签:

【中文标题】如何跟踪ruby程序的执行过程【英文标题】:How to track the execution process of ruby program 【发布时间】:2014-02-16 11:38:01 【问题描述】:

我是 ruby​​ 新手,当我对某些程序感到困惑时,我想跟踪 ruby​​ 程序的执行过程。我想知道是否有办法像 set -x 那样帮助我跟踪 shell 脚本?

PS:

如shell脚本test.sh:

set -x
ls /home
echo "hello dujun and haotianma!"

当我执行 test.sh 时,输出会是这样的:

+ ls /home
dujun  haotianma
+ echo 'hello dujun and haotianma!'
hello dujun and haotianma!

就像这个 bash 脚本在执行每个语句之前如何回显它一样,我想让一个 Ruby 程序显示正在执行的语句。

【问题讨论】:

【参考方案1】:

我认为你可以使用 Ruby 的 stdlib Tracer

我在test.rb 文件中写了一段代码:

require 'tracer'

Tracer.on

class A
  def square(a)
    @b = a*a
    result
  end
  def result
    @b
  end
end

a = A.new
puts a.square(5)

Tracer.off

现在运行代码,看看幕后发生了什么:

(arup~>Ruby)$ ruby test.rb
#0:test.rb:5::-: class A
#0:test.rb:5::C: class A
#0:test.rb:6::-:   def square(a)
#0:test.rb:10::-:   def result
#0:test.rb:13::E: end
#0:test.rb:15::-: a = A.new
#0:test.rb:16::-: puts a.square(5)
#0:test.rb:6:A:>:   def square(a)
#0:test.rb:7:A:-:     @b = a*a
#0:test.rb:8:A:-:     result
#0:test.rb:10:A:>:   def result
#0:test.rb:11:A:-:     @b
#0:test.rb:12:A:<:   end
#0:test.rb:9:A:<:   end
25
#0:test.rb:18::-: Tracer.off
(arup~>Ruby)$ 

再次查看代码。现在我更改了跟踪点。

require 'tracer'

class A
  def square(a)
    @b = a*a
    result
  end
  def result
    @b
  end
end

Tracer.on

a = A.new
puts a.square(5)

Tracer.off

现在运行代码,看看幕后发生了什么:

(arup~>Ruby)$ ruby test.rb
#0:test.rb:15::-: a = A.new
#0:test.rb:16::-: puts a.square(5)
#0:test.rb:4:A:>:   def square(a)
#0:test.rb:5:A:-:     @b = a*a
#0:test.rb:6:A:-:     result
#0:test.rb:8:A:>:   def result
#0:test.rb:9:A:-:     @b
#0:test.rb:10:A:<:   end
#0:test.rb:7:A:<:   end
25
#0:test.rb:18::-: Tracer.off
(arup~>Ruby)$ 

【讨论】:

@SergioTulentsev 谢谢,你告诉我“很好”......我从来没有得到你的任何赞赏......我今天很高兴。 :-) 我不是一个刻薄的人,你知道的 :) 酷!没有关于Tracer 课程! +1 @Abdo 是的,我认为 Ruby 中还没有任何东西可以跟踪变量。

以上是关于如何跟踪ruby程序的执行过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C/C++ 中跟踪程序过程的完成情况

sqlserver profiler为啥跟踪不到自定义的存储过程执行情况

Ruby On Rails 3.1 中的尾随日志文件

oracle如何看到transaction执行过程

在SQLSERVER里面,如何写一个存储过程来创建跟踪?

Oracle ETL日志审计存储过程示例