Pry: Zeig mir den Stapel

101

Verwenden von Pry in Rails, wenn ich einen Haltepunkt in der Codebindung.pry erreicht habe

Ich möchte wissen, wie ich hierher gekommen bin, wer mich angerufen hat, wer sie angerufen hat usw. Aber seltsamerweise sehe ich diesen Befehl nicht. Weiß jemand?

Pitosalas
quelle

Antworten:

51

Verwenden Sie das Plugin pry-stack_explorer , mit dem Sie den Aufrufstapel (mit upund down) auf und ab bewegen, den Aufrufstapel (mit ) anzeigen show-stackusw. können:

siehe hier:

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>)> 
horseyguy
quelle
138

Um dies ohne Pry-Plugins zu tun (ich hatte Probleme mit pry-stack_explorer), schauen Sie sich einfach an caller.

Ich suche tatsächlich nach meinem Projektnamen, um alle irrelevanten Schienenstapelelemente herauszufiltern. Wenn mein Projektname beispielsweise wäre, würde archieich Folgendes verwenden:

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

Das gibt mir die Stapelspur, die ich suche.

Ein kürzerer Weg wäre:

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

Welches funktioniert genauso gut.

Paul Oliver
quelle
1
Das ist toll. Ich war verärgert, weil es den Pry Call Stack enthielt und ich wollte nur, was speziell aus meiner Anwendung kam. +1!
CDPALMER
5
Perfekt. Ich habe tmux eine Tastenkombination hinzugefügt, um dies einzugeben (binde 'B' Sende-Schlüssel '... ^ M'), stattdessen ein "Ablehnen", damit es allgemeiner ist: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
Hoodslide
4
Die einzig nützliche Antwort für die Ruby-Community ist unter dem Rat begraben, einige Plugins zu installieren.
Jesse Dhillon
4
Diese Antwort verdient so viele positive Stimmen. Ja, Sie können mehr Material auf Pry installieren. Sie können aber auch die vorhandenen
Sprachfunktionen von
1
Diese Antwort sollte die richtige sein, da keine zusätzlichen Plugins erforderlich sind!
Alvaro Cavalcanti
83

Es gibt eine Pry-Backtrace , die die Backtrace für die Pry-Sitzung zeigt.

Es gibt auch wtf? . Welche Show ist die Rückverfolgung der letzten Ausnahme. Fügen Sie weitere Fragezeichen hinzu, um mehr von der Rückverfolgung anzuzeigen, oder ein Ausrufezeichen, um alles anzuzeigen.

Geben Sie help in pry ein, um alle anderen Befehle anzuzeigen :)

gef
quelle
1
pry-backtraceist in Ordnung, aber das pry-stack_explorerPlugin ist viel mächtiger (obwohl es ein weiteres Juwel ist, ein Plugin)
horseyguy
7
Aber Tatsache ist, dass Sie manchmal nicht alle diese Funktionen verwenden :)
Dzung Nguyen
1

Sie können die Aufrufermethode verwenden, die bereits in der Gem-Bibliothek definiert ist. Der Rückgabewert dieser Methode ist ein Array. Sie können also Array-Methoden für die Suche in dieser Reihe von Zeilen anwenden

Unten ist auch hilfreich für leistungsstarke Trace. https://github.com/pry/pry-stack_explorer

Nishant Upadhyay
quelle
0

Erweiterung auf Paul Olivers Antwort.

Wenn Sie eine Liste von Phrasen haben, die Sie dauerhaft ausschließen möchten, können Sie dies mit einer benutzerdefinierten Befehlsfunktion in Pry tun.

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

Das Aufrufen callerfführt zu einer gefilterten callerAusgabe. Seltsame Zeichen #{output}sind farbig, um das ursprüngliche Aussehen des zu reproduzieren caller. Ich habe die Farbe von hier genommen .

Wenn Sie keinen benutzerdefinierten Befehl erstellen möchten, können Sie alternativ den Befehlsverlauf Ctrl+Rdurchsuchen.

sloneorzeszki
quelle
Es befindet sich im Home-Ordner ~/.pryrc. Wenn nicht, erstellen Sie es einfach. ~/bedeutet immer den Home-Ordner auf Unix-Systemen.
Sloneorzeszki