微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您如何查看Ruby中的调用堆栈示例?

如何解决您如何查看Ruby中的调用堆栈示例?

| 我正在研究不同的优化技术,并且遇到了这篇文章分析效率代码?谁认为对调用堆栈进行采样比使用分析器更有效。基本思想是,如果您查看调用堆栈,则会看到应用程序大部分时间都花在哪里,然后在那里进行优化。 确实很有趣,而且他显然是这方面的专家,但是我不知道如何查看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>\'
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。