58 votes

Comment obtenir une trace de la pile d'objet en Ruby?

J'ai besoin d'obtenir une trace de la pile d'objet en Ruby; de ne pas imprimer, il suffit de lui faire faire quelques enregistrements et de dumping aux fins d'analyse ultérieure. Est-ce possible? Comment?

80voto

Sven Koschnicke Points 2351

Vous pouvez utiliser le Noyau.de l'appelant pour cela. La même méthode est utilisée lors de la génération de traces de pile pour les exceptions.

À partir de la documentation:

def a(skip)
  caller(skip)
end
def b(skip)
  a(skip)
end
def c(skip)
  b(skip)
end
c(0) #=> ["prog:2:in `a'", "prog:5:in `b'", "prog:8:in `c'", "prog:10"]
c(1) #=> ["prog:5:in `b'", "prog:8:in `c'", "prog:11"]
c(2) #=> ["prog:8:in `c'", "prog:12"]
c(3) #=> ["prog:13"]

33voto

Alex Bondar Points 41

Essayez

Thread.current.backtrace.join("\n")

13voto

Nikita Rybak Points 36641

Essayez d'erreur.backtrace:

# Returns any backtrace associated with the exception.  
# The backtrace is an array of strings, each containing either ``filename:lineNo: in `method''' or ``filename:lineNo.'‘

def a
  raise "boom"
end

def b
  a()
end

begin
  b()
rescue => detail
  print detail.backtrace.join("\n")
end

produit:

prog.rb:2:in `a'
prog.rb:6:in `b'
prog.rb:10

2voto

Sammy Larbi Points 933

Vous pouvez créer votre propre si vous le désirez. Comme l'a démontré Éloquent Ruby par Russ Olsen:

# define a proc to use that will handle your trace 
proc_object = proc do |event, file, line, id, binding, klass| 
  puts "#{event} in #{file}/#{line} #{id} #{klass}"
end 

# tell Ruby to use your proc on traceable events
set_trace_func(proc_object)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X