Pry: montre-moi la pile


101

Utilisation de Pry in Rails, lorsque j'atteins 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. Est-ce que quelqu'un sait?

Réponses:


51

Utilisez le plugin pry-stack_explorer , il vous permet de monter et descendre la pile d'appels (avec upet down), d'afficher la pile d'appels (avecshow-stack ), et ainsi de suite:

vois 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>)> 

138

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

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

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

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

Un moyen plus court serait:

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

Ce qui fonctionne aussi bien.


1
C'est bien. J'étais ennuyé parce qu'il incluait la pile d'appels de levier et je voulais juste ce qui provenait spécifiquement de mon application. +1!
cdpalmer

6
Parfait. J'ai ajouté une combinaison de touches à tmux pour entrer ceci (bind 'B' send-keys '... ^ M'), en utilisant un "rejet" à la place, donc c'est plus générique: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide

4
Fidèle à la forme pour la communauté Ruby, la seule réponse utile se trouve sous les conseils pour aller installer quelques plugins.
Jesse Dhillon

4
cette réponse mérite tant de votes positifs. Oui, vous pouvez installer plus de choses par-dessus le levier. Mais vous pouvez également utiliser les fonctionnalités de langage existantes de ruby ​​pour aller presque aussi loin (certainement assez pour répondre à la question de l'OP!)
amenthes

1
Cette réponse devrait être la bonne car elle ne nécessite aucun plug-in supplémentaire!
Alvaro Cavalcanti

83

Il y a un retour en arrière qui montre la trace de la session Pry.

Il y a aussi wtf? . Quelle émission est la trace de l'exception la plus récente. Ajoutez plus de points d'interrogation pour voir plus de la trace arrière ou un point d'exclamation pour tout voir.

Tapez help dans pry pour voir toutes les autres commandes :)


1
pry-backtraceest ok, mais le pry-stack_explorerplugin est beaucoup plus puissant (bien que ce soit un autre bijou, un plugin)
horseyguy

7
mais le fait est que parfois vous n'utilisez pas toutes ces fonctionnalités :)
Dzung Nguyen

1

Vous pouvez utiliser la méthode de l'appelant déjà définie dans la bibliothèque de gemmes. La valeur de retour de cette méthode sera un tableau. Ainsi, vous pouvez appliquer des méthodes de tableau pour la recherche dans ce groupe de lignes

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


0

S'étendant sur la réponse de Paul Oliver.

Si vous avez une liste de phrases que vous souhaitez exclure définitivement, vous pouvez le faire avec une fonctionnalité de commandes personnalisées dans Pry.

Dans ~/.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

L'appel callerfentraînera une callersortie filtrée . Des signes étranges #{output}sont colorés pour reproduire le look original du caller. J'ai pris la couleur d' ici .

Sinon, si vous ne souhaitez pas créer de commande personnalisée, utilisez Ctrl+Rpour rechercher dans l'historique des commandes.


C'est dans le dossier personnel ~/.pryrc. Sinon, créez-le. ~/signifie toujours le dossier de départ sur les systèmes Unix.
sloneorzeszki
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.