Pry: मुझे स्टैक दिखाओ


101

जब मैं कोड बाइंडिंग में ब्रेकपॉइंट मारता हूँ, तो रेल्स में Pry का उपयोग करना

मैं जानना चाहता हूं कि मैं यहां कैसे पहुंचा, किसने मुझे फोन किया, किसने फोन किया, आदि। लेकिन अजीब तरह से मैं उस कमांड को नहीं देखता। क्या कोई जानता है?

जवाबों:


51

Pry-stack_explorer प्लगइन का उपयोग करें , यह आपको कॉल-स्टैक ( upऔर down) के साथ ऊपर और नीचे जाने की अनुमति देता है , कॉलस्टैक (साथ show-stack), और इसी तरह प्रदर्शित करें:

यहाँ देखें:

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

138

किसी भी pry plugins के बिना ऐसा करने के लिए (मुझे pry-stack_explorer से परेशानी हो रही थी), बस देखो caller

मैं वास्तव में सभी अप्रासंगिक रेल स्टैक आइटम को फ़िल्टर करने के लिए अपने प्रोजेक्ट नाम की तलाश करता हूं। उदाहरण के लिए, यदि मेरे प्रोजेक्ट का नाम archieमैं उपयोग कर रहा था:

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

जो मुझे वह स्टैक ट्रेस देता है जिसकी मुझे तलाश है।

एक छोटा रास्ता होगा:

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

जो काम भी करता है।


1
यह भी खूब रही। मैं नाराज था क्योंकि इसमें प्राइ कॉल स्टैक शामिल था और मैं सिर्फ वही चाहता था जो विशेष रूप से मेरे आवेदन से आ रहा था। +1!
cdpalmer

6
उत्तम। मैंने इसे दर्ज करने के लिए tmux में एक की-कॉम्बो (b '' B 'सेंड-कीज़' ... ^ M ') जोड़ा, इसके बजाय "अस्वीकार" का उपयोग करते हुए यह अधिक सामान्य है: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
हुडस्लाइड

4
रूबी समुदाय के लिए फार्म का सच है, केवल उपयोगी उत्तर कुछ प्लगइन्स को स्थापित करने के लिए सलाह के नीचे दफन है।
जेसी ढिल्लों

4
यह उत्तर इतने सारे उत्थान का हकदार है। हां, आप pry के शीर्ष पर अधिक सामान स्थापित कर सकते हैं । लेकिन आप रूबी की मौजूदा भाषा सुविधाओं का उपयोग लगभग प्राप्त करने के लिए कर सकते हैं (निश्चित रूप से ओपी के सवाल का जवाब देने के लिए पर्याप्त है!)
amenthes

1
यह उत्तर सही होना चाहिए क्योंकि इसमें अतिरिक्त प्लगइन्स की आवश्यकता नहीं है!
अल्वारो कैवलन्ती

83

वहाँ pry-backtrace है जो Pry सत्र के लिए backtrace दिखाता है।

Wtf भी है ? । जो सबसे हालिया अपवाद का शो है। अधिक प्रश्न देखने के लिए अधिक प्रश्न चिह्न जोड़ें या यह देखने के लिए विस्मयादिबोधक चिह्न।

अन्य सभी कमांड को देखने के लिए pry में मदद टाइप करें :)


1
pry-backtraceयह ठीक है, लेकिन pry-stack_explorerप्लगइन अधिक शक्तिशाली है (हालांकि यह एक और रत्न है, एक प्लगइन)
घोड़े की मरजी

7
लेकिन तथ्य यह है कि कभी-कभी आप उन सभी विशेषताओं का उपयोग नहीं करते हैं :)
Dzung Nguyen

1

आप कॉलर विधि का उपयोग कर सकते हैं जो पहले से ही मणि पुस्तकालय के अंदर परिभाषित है। उस पद्धति का रिटर्न मान एक सरणी होगा। तो आप लाइनों के उस समूह में खोज के लिए सरणी विधियों को लागू कर सकते हैं

नीचे शक्तिशाली ट्रेस के लिए भी उपयोगी है। https://github.com/pry/pry-stack_explorer


0

पॉल ओलिवर के उत्तर पर विस्तार।

यदि आपके पास उन वाक्यांशों की सूची है, जिन्हें आप स्थायी रूप से बाहर करना चाहते हैं, तो आप ऐसा कर सकते हैं, जो Pry में एक कस्टम कमांड सुविधा के साथ है।

इन ~/.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

कॉलिंग के callerfपरिणामस्वरूप फ़िल्टर किए गए callerआउटपुट होंगे। चारों ओर अजीब संकेत #{output}के मूल स्वरूप को दोहराने के लिए रंग है caller। मैंने यहां से रंग लिया ।

वैकल्पिक रूप से, यदि आप एक कस्टम कमांड नहीं बनाना चाहते हैं, तो Ctrl+Rकमांड इतिहास के माध्यम से खोज करने के लिए उपयोग करें।


यह होम फोल्डर में है ~/.pryrc। यदि नहीं, तो इसे बनाएं। ~/हमेशा यूनिक्स सिस्टम पर होम फोल्डर का मतलब है।
sloneorzeszki
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.