问题描述
|
我正在研究不同的优化技术,并且遇到了这篇文章分析效率代码?谁认为对调用堆栈进行采样比使用分析器更有效。基本思想是,如果您查看调用堆栈,则会看到应用程序大部分时间都花在哪里,然后在那里进行优化。
确实很有趣,而且他显然是这方面的专家,但是我不知道如何查看ruby中的调用堆栈。在调试器中,我可以说\“ info stack \”,但似乎只显示一行。
编辑:我看到Mike Dunlavey的评论:\“我想指出的是,如果您在调试器下运行,请手动中断它,并显示调用堆栈... \”
我只是不确定如何手动中断它并浸入调用堆栈。
解决方法
刚放
puts caller
代码中的任何地方。如果您不喜欢它的格式,则它是一个字符串数组,因此您可以对所需的输出进行一些正则表达式操作。
, 向红宝石进程发送信号并为转储所有堆栈的信号创建处理程序怎么样?
在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_...
在适当的采样时间重复信号。
, 您可以随时抛出异常,然后查看“ 3”预定义变量,该变量返回回溯数据数组。例如。把它放在foo.rb中:
begin
raise \'foo\'
rescue
puts $@
end
然后运行它:
$ ruby foo.rb
foo.rb:2:in `<main>\'