Hogyan látja a mintát a hívási verem a rubin?

szavazat
34

Én vizsgáló különböző optimalizációs technikák, és a kezembe került ez a poszt elemezve kód hatásfoka? valaki, aki úgy véli, hogy a mintavétel a hívási verem hatékonyabb, mint egy profiler. Az alapötlet az, hogy ha egy néző a hívás verem, látod, ahol az alkalmazás a legvalószínűbb, hogy tölteni a legtöbb időt, és az optimalizálást is.

Ez minden bizonnyal érdekes, és ő nyilván egy szakértő, de nem tudom, hogyan lehet megtekinteni a hívás verem rubin. A debugger Azt lehet mondani, „info verem”, de csak úgy tűnik, hogy megmutassa egy sort.

EDIT: Láttam ezt a megjegyzést Mike Dunlavey: „Szeretném kiemelni, hogy ha fut az debugger, szakítsa meg kézzel, és megjeleníti a hívás verem ...”

Csak nem vagyok benne biztos, hogy szakítsa meg kézzel és dipslay hívás verem.

A kérdést 12/06/2011 13:39
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
4

Akkor dobni egy kivételt bármikor, majd nézd meg a $@előre definiált változó, amely visszaadja egy tömb backtrace adatokat. Pl hogy ezt foo.rb:

begin                                                                        
  raise 'foo'                                                                
rescue                                                                       
  puts $@                                                                    
end  

Ezután futtatni:

$ ruby foo.rb 
foo.rb:2:in `<main>'
Válaszolt 12/06/2011 13:49
a forrás felhasználó

szavazat
74

csak tegye

puts caller

bárhol a kódot. Ha nem tetszik a méret, ez egy tömböt, így némi regex manipuláció a kívánt kimenet.

Válaszolt 12/06/2011 14:33
a forrás felhasználó

szavazat
4

Mit szólnál küld jelet a rubin folyamat, valamint egy kezelőt a jelet, amely kiírja minden halom?

Tól http://le-huy.blogspot.com/2012/04/dump-backtrace-of-all-threads-in-ruby.html van ebben a példában:

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

Ezután meg kell küldeni a jelet a megfelelő folyamat:

ps afxw | grep ruby
kill -29 <pid>
ls -l /tmp/ruby*
vi /tmp/ruby_backtrace_...

Ismételjük meg a jelet a megfelelő mintavételi idő.

Válaszolt 05/10/2014 01:47
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more