Pry: pokaż mi stos

101

Korzystanie z Pry w Railsach, kiedy trafię w punkt przerwania w kodzie binding.pry

Chcę wiedzieć, jak się tu dostałem, kto do mnie dzwonił, kto do nich dzwonił itd. Ale dziwnie nie widzę tego polecenia. Czy ktoś wie?

pitosalas
źródło

Odpowiedzi:

51

Użyj wtyczki pry-stack_explorer , która pozwala na poruszanie się w górę iw dół stosu wywołań (za pomocą upi down), wyświetlanie stosu wywołań (za pomocą show-stack) i tak dalej:

Spójrz tutaj:

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>)> 
koński
źródło
138

Aby to zrobić bez żadnych wtyczek podważających (miałem problemy z pry-stack_explorer), po prostu spójrz na caller.

Właściwie szukam nazwy mojego projektu, aby odfiltrować wszystkie nieistotne elementy stosu szyn. Na przykład, gdyby nazwa mojego projektu archiebrzmiała:

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

Co daje mi ślad stosu, którego szukam.

Krótszy sposób to:

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

Co działa równie dobrze.

Paul Oliver
źródło
1
To jest świetne. Byłem zirytowany, ponieważ zawierał stos wywołań podważania i chciałem tylko, co konkretnie pochodzi z mojej aplikacji. +1!
cdpalmer
6
Idealny. Dodałem kombinację klawiszy do tmux, aby to wprowadzić (połącz 'B' klawisze wysyłania '... ^ M'), używając zamiast tego "odrzucenia", więc jest bardziej ogólny: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide
4
Zgodnie z formułą dla społeczności Rubiego, jedyną przydatną odpowiedzią jest ukryta pod poradą, aby zainstalować kilka wtyczek.
Jesse Dhillon
4
ta odpowiedź zasługuje na tak wiele głosów poparcia. Tak, można zainstalować więcej rzeczy na wierzchu podważyć. Ale możesz również użyć istniejących funkcji językowych Ruby, aby dostać się prawie tak daleko (na pewno wystarczająco daleko, aby odpowiedzieć na pytanie OP!)
amenthes
1
Ta odpowiedź powinna być poprawna, ponieważ nie wymaga żadnych dodatkowych wtyczek!
Alvaro Cavalcanti
83

Jest pry-backtrace, który pokazuje ślad dla sesji Pry.

Jest też wtf? . Który program jest śladem ostatniego wyjątku. Dodaj więcej znaków zapytania, aby zobaczyć więcej śladu wstecznego lub wykrzyknik, aby zobaczyć wszystko.

Wpisz help w podważeniu, aby zobaczyć wszystkie inne polecenia :)

gef
źródło
1
pry-backtracejest ok, ale pry-stack_explorerwtyczka jest o wiele potężniejsza (choć to kolejny klejnot, wtyczka)
horseyguy
7
ale faktem jest, że czasami nie używasz wszystkich tych funkcji :)
Dzung Nguyen
1

Możesz użyć metody caller, która jest już zdefiniowana w bibliotece gem. Wartość zwracana przez tę metodę będzie tablicą. Możesz więc zdarzenie zastosować metody tablicowe do wyszukiwania w tej grupie wierszy

Poniżej jest również pomocna w przypadku potężnego śledzenia. https://github.com/pry/pry-stack_explorer

Nishant Upadhyay
źródło
0

Rozszerzając odpowiedź Paula Olivera.

Jeśli masz listę fraz, które chcesz trwale wykluczyć, możesz to zrobić za pomocą funkcji poleceń niestandardowych w Pry.

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

Wywołanie callerfspowoduje przefiltrowanie callerdanych wyjściowych. Dziwne znaki wokół #{output}są kolorowane, aby odtworzyć oryginalny wygląd caller. Wziąłem stąd kolor .

Alternatywnie, jeśli nie chcesz tworzyć niestandardowego polecenia, użyj Ctrl+Rdo przeszukiwania historii poleceń.

sloneorzeszki
źródło
Jest w folderze domowym ~/.pryrc. Jeśli nie, po prostu go utwórz. ~/zawsze oznacza katalog domowy w systemach uniksowych.
sloneorzeszki