126 votes

Pry : montre-moi la pile

En utilisant Pry dans Rails, lorsque je touche un point d'arrêt dans le code binding.pry

Je veux savoir comment je suis arrivé ici, qui m'a appelé, qui les a appelés, etc. Mais bizarrement, je ne vois pas cette commande. Quelqu'un sait-il ?

172voto

Paul Oliver Points 1914

Pour faire cela sans aucun plugin pry (j'avais des problèmes avec pry-stack_explorer), il suffit de regarder à caller .

En fait, je cherche le nom de mon projet pour filtrer tous les éléments non pertinents de la pile de rails. Par exemple, si le nom de mon projet était archie Je l'utiliserais :

caller.select {|line| line.include? "archie" }

Ce qui me donne la trace de la pile que je cherche.

Un moyen plus court serait :

caller.select {|x| x["archie"] }

Ce qui fonctionne tout aussi bien.

91voto

gef Points 3033

Il y a pry-backtrace qui montre le backtrace de la session Pry.

Il existe également wtf ? . qui montre le backtrace de l'exception la plus récente. Ajoutez des points d'interrogation pour afficher une plus grande partie de la rétrospective ou un point d'exclamation pour tout voir.

Type aide in pry pour voir toutes les autres commandes :)

61voto

banister Points 13181

Utilisez le pry-stack_explorer il vous permet de vous déplacer vers le haut et vers le bas de la pile d'appels (avec l'option up y down ), afficher la pile d'appels (avec show-stack ), et ainsi de suite :

voir ici :

Frame number: 0/64

From: /Users/johnmair/ruby/rails_projects/personal_site/app/controllers/posts_controller.rb @ line 7 PostsController#index:

    5: def index
    6:   @posts = Post.all
 => 7:   binding.pry
    8: end

[1] pry(#<PostsController>)> show-stack

Showing all accessible frames in stack (65 in total):
--
=> #0  index <PostsController#index()>
   #1 [method]  send_action <ActionController::ImplicitRender#send_action(method, *args)>
   #2 [method]  process_action <AbstractController::Base#process_action(method_name, *args)>
   #3 [method]  process_action <ActionController::Rendering#process_action(*arg1)>
<... clipped ...>

[2] pry(#<PostsController>)> up

Frame number: 1/64
Frame type: method

From: /Users/johnmair/.rvm/gems/ruby-2.0.0-p0/gems/actionpack-3.2.8/lib/action_controller/metal/implicit_render.rb @ line 4 ActionController::ImplicitRender#send_action:

    3: def send_action(method, *args)
 => 4:   ret = super
    5:   default_render unless response_body
    6:   ret
    7: end

[3] pry(#<PostsController>)>

2voto

sloneorzeszki Points 722

En prolongement de la réponse de Paul Oliver.

Si vous avez une liste de phrases que vous voulez exclure de façon permanente, vous pouvez le faire avec une fonction de commandes personnalisées dans Pry.

Sur ~/.pryrc :

Pry::Commands.block_command "callerf", "Filter the caller backtrace" do
  output = caller.reject! { |line| line["minitest"] || line["pry"] } 
  puts "\e[31m#{output.join("\n")}\e[0m"
end

Appel à callerf donnera lieu à un filtrage caller sortie. Signes étranges autour #{output} est coloré pour reproduire l'aspect original de la caller . J'ai pris la couleur de aquí .

Alternativement, si vous ne voulez pas créer une commande personnalisée, utilisez Ctrl+R pour rechercher dans l'historique des commandes.

1voto

Nishant Upadhyay Points 414

Vous pouvez utiliser la méthode caller qui est déjà définie dans la bibliothèque gem. La valeur de retour de cette méthode sera un tableau. Vous pouvez donc appliquer les méthodes de tableau pour la recherche dans ce groupe de lignes.

Ci-dessous est également utile pour la trace puissante. https://github.com/pry/pry-stack_explorer

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