Pry: tunjukkan tumpukannya

101

Menggunakan Pry in Rails, ketika saya mencapai breakpoint di kode binding.pry

Saya ingin tahu bagaimana saya sampai di sini, siapa yang menelepon saya, siapa yang memanggil mereka, dll. Tapi anehnya saya tidak melihat perintah itu. Apakah ada yang tahu?

pitosalas
sumber

Jawaban:

51

Gunakan plugin pry-stack_explorer , ini memungkinkan Anda untuk bergerak ke atas dan ke bawah tumpukan panggilan (dengan updan down), menampilkan callstack (dengan show-stack), dan seterusnya:

Lihat disini:

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
sumber
138

Untuk melakukan ini tanpa plugin pry (saya mengalami masalah dengan pry-stack_explorer), lihat saja caller.

Saya benar-benar mencari nama proyek saya untuk menyaring semua item tumpukan rel yang tidak relevan. Misalnya, jika nama proyek saya, archiesaya akan menggunakan:

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

Yang memberi saya jejak tumpukan yang saya cari.

Cara yang lebih singkat adalah:

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

Yang mana bekerja dengan baik.

Paul Oliver
sumber
1
Ini bagus. Saya kesal karena itu termasuk tumpukan panggilan pry dan saya hanya ingin apa yang secara khusus berasal dari aplikasi saya. +1!
cdpalmer
6
Sempurna. Saya menambahkan key-combo ke tmux untuk memasukkan ini (mengikat 'B' send-keys '... ^ M'), menggunakan "tolak" jadi lebih umum: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide
4
Sesuai dengan formulir untuk komunitas Ruby, satu-satunya jawaban yang berguna terkubur di bawah saran untuk menginstal beberapa plugin.
Jesse Dhillon
4
jawaban ini layak mendapat banyak suara positif. Ya, Anda dapat menginstal lebih banyak barang di atas pry. Tetapi Anda juga dapat menggunakan fitur bahasa Ruby yang sudah ada untuk melangkah lebih jauh (tentunya cukup jauh untuk menjawab pertanyaan OP!)
amenthes
1
Jawaban ini harus benar karena tidak memerlukan plugin tambahan!
Alvaro Cavalcanti
83

Ada pry-backtrace yang merupakan backtrace untuk sesi Pry.

Ada juga wtf? . Yang menunjukkan lacak balik dari pengecualian terbaru. Tambahkan lebih banyak tanda tanya untuk melihat lebih banyak lacak balik atau tanda seru untuk melihat semuanya.

Ketik help in pry untuk melihat semua perintah lainnya :)

gef
sumber
1
pry-backtracetidak apa-apa, tetapi pry-stack_explorerplugin jauh lebih kuat (meskipun itu permata lain, plugin)
horseyguy
7
tetapi kenyataannya terkadang Anda tidak menggunakan semua fitur tersebut :)
Dzung Nguyen
1

Anda dapat menggunakan metode pemanggil yang telah ditentukan di dalam perpustakaan permata. Nilai yang dikembalikan dari metode itu akan menjadi array. Jadi Anda dapat menerapkan metode array untuk pencarian di sekelompok baris itu

Di bawah ini juga berguna untuk penelusuran yang kuat. https://github.com/pry/pry-stack_explorer

Nishant Upadhyay
sumber
0

Memperluas jawaban Paul Oliver.

Jika Anda memiliki daftar frasa yang ingin Anda kecualikan secara permanen, Anda dapat melakukannya dengan fitur perintah khusus di Pry.

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

Memanggil callerfakan menghasilkan callerkeluaran yang difilter . Tanda-tanda aneh di sekitar #{output}mewarnai untuk meniru tampilan asli dari caller. Saya mengambil warna dari sini .

Alternatifnya, jika Anda tidak ingin membuat perintah khusus, gunakan Ctrl+Runtuk menelusuri riwayat perintah.

sloneorzeszki
sumber
Itu ada di folder rumah ~/.pryrc. Jika tidak, buat saja. ~/selalu berarti folder home di sistem Unix.
sloneorzeszki