2013-03-08 16 views
69

Utilizzando Pry in Rails, quando ho colpito un punto di interruzione nel codice binding.pryleva: mi mostra lo stack

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

risposta

41

usare il plugin pry-stack_explorer, che consente di spostare su e giù per lo stack di chiamate (con up e down), visualizzare lo stack (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>)> 
75

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

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

Tipo help a ficcare il naso per vedere tutti gli altri comandi :)

+1

'leva-backtrace' è ok, ma' plugin sollevare-stack_explorer' è il modo più potente (anche se è un altro gioiello, un plugin) – horseyguy

+7

ma il fatto è a volte non si utilizzano tutte quelle caratteristiche :) – nXqd

+3

Grazie non sapevo wtf? comando! –

66

per fare questo senza alcun plugin di leva (stavo avendo problemi con leva-stack_explorer), basta guardare caller.

In realtà, cerco il nome del mio progetto per filtrare tutti gli elementi dello stack di binari irrilevanti. Ad esempio, se il mio nome del progetto erano archie userei:

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

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

una via più breve potrebbe essere:

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

che funziona altrettanto bene.

+0

Questo è fantastico. Ero seccato perché includeva lo stack delle chiamate di leva e volevo solo quello che proveniva in particolare dalla mia applicazione. +1! – cdpalmer

+3

Perfetto. Ho aggiunto una chiave-combo a tmux per entrare in questo (bind 'B' send-keys '...^M'), usando invece un "reject" quindi è più generico: '' 'caller.reject {| x | x ["fornitore/pacchetto"] || x ["/. rbenv/versions /"]} '' ' – hoodslide

+2

Vero per la forma per la comunità Ruby, l'unica risposta utile è sepolto sotto consiglio di andare installare alcuni plugin. –

1

È possibile utilizzare il metodo chiamante già definito all'interno della libreria gem. Il valore di ritorno di tale metodo sarà un array. In questo modo è possibile applicare i metodi array per la ricerca in quel gruppo di righe

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