web-dev-qa-db-fra.com

Pry: montre moi la pile

À l'aide de Pry in Rails, lorsque je frappe 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 curieusement, je ne vois pas cet ordre. Est-ce que quelqu'un sait?

85
pitosalas

Utilisez le plugin pry-stack_Explorer , il vous permet de monter et de descendre dans la pile d'appels (avec up et down), d'afficher la pile d'appels (avec show-stack), etc:

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>)> 
46
horseyguy

Pour faire cela sans aucun plugin (je rencontrais des problèmes avec pry-stack_Explorer), il suffit de regarder caller .

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

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

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

Un moyen plus court serait:

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

Ce qui fonctionne aussi bien.

110
Paul Oliver

Il y a pry-backtrace qui affiche la trace de la trace de la session Pry.

Il y a aussi wtf? . Quelle émission est la trace de la plus récente exception. Ajoutez plus de points d'interrogation pour afficher davantage de la trace ou un point d'exclamation pour tout visualiser.

Tapez help dans le levier pour voir toutes les autres commandes :)

80
gef

Vous pouvez utiliser la méthode de l'appelant déjà définie dans la bibliothèque de pierres précieuses. La valeur de retour de cette méthode sera un tableau. Donc, vous pouvez éventuellement appliquer des 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

1
Nishant Upadhyay

Étendre la réponse de Paul Oliver.

Si vous souhaitez exclure de manière permanente une liste de phrases, vous pouvez le faire avec une fonction de commande personnalisée 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 de callerf aboutira à une sortie filtrée de caller. Signes étranges autour de #{output} est en train de colorier pour reproduire l'aspect original du caller. J'ai pris la couleur de ici .

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

0
sloneorzeszki