Pry: bana yığını göster


101

Pry in Rails kullanarak, kod bağlamasında bir kesme noktasına ulaştığımda.

Buraya nasıl geldiğimi, beni kimin aradığını, onları kimin aradığını vb. Bilmek istiyorum. Ama tuhaf bir şekilde bu komutu görmüyorum. Kimse biliyor mu?

Yanıtlar:


51

Pry-stack_explorer eklentisini kullanın, çağrı yığınını ( upve ile down) yukarı ve aşağı hareket ettirmenize, çağrı yığınını (ile ) görüntülemenize show-stackvb.

buraya bakın:

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>)> 

139

Bunu herhangi bir gözetleme eklentisi olmadan yapmak için (gözetlemek-stack_explorer ile sorunlar yaşıyordum), sadece bakın caller.

Aslında tüm alakasız ray yığın öğelerini filtrelemek için proje adımı arıyorum. Örneğin, proje adım archieolsaydı şunu kullanırdım:

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

Bu da bana aradığım yığın izini veriyor.

Daha kısa bir yol şöyle olacaktır:

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

Bu da aynı şekilde çalışıyor.


1
Bu harika. Sinirlenmiştim çünkü gözetleme çağrısı yığınını içeriyordu ve sadece uygulamamdan özel olarak gelen şeyi istedim. +1!
cdpalmer

6
Mükemmel. Bunu girmek için tmux'a bir key-combo ekledim ('B' send-keys '... ^ M'), bunun yerine bir "reject" kullanarak, böylece daha genel: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide

4
Ruby topluluğu için doğru şekle göre, tek yararlı cevap, bazı eklentileri kurmaya gitme tavsiyesinin altında gömülüdür.
Jesse Dhillon

4
bu cevap çok fazla oyu hak ediyor. Evet, yapabilirsiniz gözetlemek üstünde daha fazla şeyler yükleyin. Ama aynı zamanda Ruby'nin mevcut dil özelliklerini de neredeyse gidebilmek için kullanabilirsiniz (kesinlikle OP'nin sorusunu cevaplayacak kadar uzağa!)
amenthes

1
Ek eklenti gerektirmediği için bu cevap doğru cevap olmalıdır!
Alvaro Cavalcanti

83

Orada gözetlemek-backtrace hangi gösteri kaldırın oturumu için backtrace bu.

Ayrıca wtf var mı? . Hangi şov, en son istisnanın izini sürüyor. Daha fazla geri izlemeyi görüntülemek için daha fazla soru işareti veya tümünü görmek için bir ünlem işareti ekleyin.

Tür yardım gözetlemek diğer tüm komutları görmek için :)


1
pry-backtracetamam, ancak pry-stack_explorereklenti çok daha güçlü (yine de başka bir mücevher, bir eklenti)
horseyguy

7
ama gerçek şu ki bazen tüm bu özellikleri
kullanmıyorsunuz

1

Gem kitaplığında önceden tanımlanmış olan çağırma yöntemini kullanabilirsiniz. Bu yöntemin dönüş değeri bir dizi olacaktır. Böylece, bu satır dizisinde arama için dizi yöntemlerini uygulayabilirsiniz.

Aşağıda güçlü izleme için de yararlıdır. https://github.com/pry/pry-stack_explorer


0

Paul Oliver'ın cevabını genişletiyoruz.

Kalıcı olarak dışlamak istediğiniz bir kelime öbeği listeniz varsa, bunu Pry'deki özel komutlar özelliği ile yapabilirsiniz.

İçinde ~/.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

Çağırma callerf, filtrelenmiş bir çıktıyla sonuçlanacaktır caller. Garip işaretler etrafında #{output}özgün bir görünüm çoğaltmak için boyama edilir caller. Rengi buradan aldım .

Alternatif olarak, özel bir komut oluşturmak istemiyorsanız, Ctrl+Rkomut geçmişinde arama yapmak için kullanın.


Ev klasöründe ~/.pryrc. Değilse, sadece oluşturun. ~/her zaman Unix sistemlerindeki ana klasör anlamına gelir.
sloneorzeszki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.