Fai leva: mostrami la pila


101

Utilizzando Pry in Rails, quando raggiungo un punto di interruzione nel codice binding.pry

Voglio sapere come sono arrivato qui, chi mi ha chiamato, chi li ha chiamati, ecc. Ma stranamente non vedo quel comando. Qualcuno sa?

Risposte:


51

Usa il plugin pry-stack_explorer , ti permette di muoverti su e giù per lo stack di chiamate (con upe down), visualizzare lo stack di chiamate (con show-stack) e così via:

Vedere qui:

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

Per farlo senza plug-in di leva (avevo problemi con pry-stack_explorer), guarda caller.

In realtà cerco il nome del mio progetto per filtrare tutti gli elementi impilati di rotaie irrilevanti. Ad esempio, se il nome del mio progetto fosse, archieuserei:

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

Il che mi dà la traccia dello stack che sto cercando.

Un modo più breve sarebbe:

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

Che funziona altrettanto bene.


1
Questo è fantastico. Ero infastidito perché includeva lo stack di chiamate di leva e volevo solo ciò che proveniva specificamente dalla mia applicazione. +1!
cdpalmer

6
Perfetto. Ho aggiunto una combinazione di tasti a tmux per inserire questo (bind 'B' send-keys '... ^ M'), utilizzando invece un "rifiuto" quindi è più generico: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide

4
Fedele alla formulazione per la comunità Ruby, l'unica risposta utile è nascosta sotto il consiglio di andare a installare alcuni plugin.
Jesse Dhillon

4
questa risposta merita tanti voti positivi. Sì, puoi installare più cose su leva. Ma potresti anche usare le funzionalità linguistiche esistenti di Ruby per arrivare quasi il più lontano (sicuramente abbastanza lontano per rispondere alla domanda dell'OP!)
amenthes

1
Questa risposta dovrebbe essere quella corretta in quanto non richiede plugin aggiuntivi!
Alvaro Cavalcanti

83

C'è pry-backtrace che è il backtrace per la sessione di Pry.

C'è anche wtf? . Quale spettacolo è il backtrace dell'eccezione più recente. Aggiungi più punti interrogativi per visualizzare più backtrace o un punto esclamativo per vedere tutto.

Digita help in pry per vedere tutti gli altri comandi :)


1
pry-backtraceva bene, ma il pry-stack_explorerplugin è molto più potente (anche se è un altro gioiello, un plugin)
horseyguy

7
ma il fatto è che a volte non usi tutte queste funzionalità :)
Dzung Nguyen

1

Puoi usare il metodo del chiamante che è già definito nella libreria gem. Il valore restituito da quel metodo sarà un array. Quindi puoi applicare metodi di array per la ricerca in quel gruppo di righe

Di seguito è anche utile per una traccia potente. https://github.com/pry/pry-stack_explorer


0

Estendendo la risposta di Paul Oliver.

Se hai un elenco di frasi che desideri escludere in modo permanente, puoi farlo con una funzione di comandi personalizzati in Pry.

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

La chiamata callerfrisulterà in un calleroutput filtrato . I segni strani intorno #{output}stanno colorando per replicare l'aspetto originale del caller. Ho preso il colore da qui .

In alternativa, se non vuoi creare un comando personalizzato, usa Ctrl+Rper cercare nella cronologia dei comandi.


È nella cartella home ~/.pryrc. In caso contrario, crealo e basta. ~/indica sempre la cartella home sui sistemi Unix.
sloneorzeszki
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.