你如何在ruby中查看调用堆栈的样本?
我正在研究不同的优化技术,我遇到了这个post分析代码的效率? 由相信采样调用堆栈的人比使用探查器更有效。 其基本思想是,如果您查看调用堆栈,则可以看到应用程序最可能花费的大部分时间,然后在那里进行优化。
这当然是有趣的,他显然是这方面的专家,但我不知道如何查看ruby的调用堆栈。 在debugging器中,我可以说“信息堆栈”,但似乎只显示一行。
编辑:我看到了这个评论由迈克·邓拉维:“我只想指出,如果你在debugging器下运行,手动中断,并显示调用堆栈…”
我只是不知道如何手动中断它,并减less调用堆栈。
刚刚放
puts caller
代码中的任何地方。 如果你不喜欢它的格式,它是一个string数组,所以你可以做一些正则expression式操作来获得所需的输出。
您可以随时抛出exception,然后查看$@
预定义variables,该variables返回一个回溯数据数组。 例如把这个在foo.rb中:
begin raise 'foo' rescue puts $@ end
然后运行它:
$ ruby foo.rb foo.rb:2:in `<main>'
如何发送信号到ruby进程,并创build一个处理器的信号转储所有堆栈?
从http://le-huy.blogspot.com/2012/04/dump-backtrace-of-all-threads-in-ruby.html我们有这个例子:;
require 'pp' def backtrace_for_all_threads(signame) File.open("/tmp/ruby_backtrace_#{Process.pid}.txt","a") do |f| f.puts "--- got signal #{signame}, dump backtrace for all threads at #{Time.now}" if Thread.current.respond_to?(:backtrace) Thread.list.each do |t| f.puts t.inspect PP.pp(t.backtrace.delete_if {|frame| frame =~ /^#{File.expand_path(__FILE__)}/}, f) # remove frames resulting from calling this method end else PP.pp(caller.delete_if {|frame| frame =~ /^#{File.expand_path(__FILE__)}/}, f) # remove frames resulting from calling this method end end end Signal.trap(29) do backtrace_for_all_threads("INFO") end
那么我们需要把信号发送到适当的过程:
ps afxw | grep ruby kill -29 <pid> ls -l /tmp/ruby* vi /tmp/ruby_backtrace_...
在适当的采样时间重复信号。