Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

अपने रूबी तरीकों की जासूसी कैसे करें

रूबी में एक अंतर्निहित अनुरेखण प्रणाली है जिसे आप TracePoint . का उपयोग करके एक्सेस कर सकते हैं कक्षा। कुछ चीज़ें जिन्हें आप ट्रेस कर सकते हैं, वे हैं मेथड कॉल, नए थ्रेड और अपवाद।

आप इसका उपयोग क्यों करना चाहेंगे?

ठीक है, यदि आप किसी निश्चित विधि के निष्पादन का पता लगाना चाहते हैं तो यह उपयोगी हो सकता है। आप देख पाएंगे कि अन्य विधियों को क्या कहा जा रहा है और वापसी मूल्य क्या हैं।

आइए कुछ उदाहरण देखें!

ट्रेसिंग मेथड कॉल्स

अधिकतर समय आप TracePoint चाहते हैं एप्लिकेशन कोड का पता लगाने के लिए और अंतर्निहित विधियों (जैसे पुट, आकार, आदि) को नहीं।

आप call . का उपयोग करके ऐसा कर सकते हैं घटना।

उदाहरण :

def the_method; other_method; end
def other_method; end

def start_trace
  trace =
  TracePoint.new(:call) { |tp| p [tp.path, tp.lineno, tp.event, tp.method_id] }

  trace.enable
  yield
  trace.disable
end

start_trace { the_method }

यह फ़ाइल पथ, पंक्ति संख्या, घटना का नाम और विधि का नाम प्रिंट करता है।

["test.rb", 1, :call, :the_method]
["test.rb", 2, :call, :other_method]

यदि आप कोई ईवेंट निर्दिष्ट नहीं करते हैं, तो रूबी उन सभी के लिए आपके ब्लॉक को कॉल करेगी, जिसके परिणामस्वरूप अधिक आउटपुट होगा। इसलिए मैं अनुशंसा करता हूं कि आप विशिष्ट घटनाओं पर ध्यान केंद्रित करें ताकि आप जो चाहते हैं उसे तेज़ी से ढूंढ सकें 🙂

यहाँ TracePoint की एक तालिका है इवेंट:

<थ>विवरण
इवेंट का नाम
कॉल करें आवेदन के तरीके
c_call सी-लेवल तरीके (जैसे पुट)
वापसी विधि वापसी (रिटर्न मान और कॉल की गहराई का पता लगाने के लिए)
b_call ब्लॉक कॉल
b_return ब्लॉक रिटर्न
उठाएं अपवाद उठाया गया
thread_begin नया सूत्र
थ्रेड_एंड थ्रेड एंडिंग

ट्रेसपॉइंट + ग्राफविज़

कई विधियाँ केवल 3 विधियों से अधिक कॉल करेंगी, विशेष रूप से फ्रेमवर्क कोड में, इसलिए Tracepoint से आउटपुट कल्पना करना कठिन हो सकता है।

इसलिए मैंने एक ऐसा रत्न बनाया है जिससे आप इस तरह से एक विज़ुअल कॉल ग्राफ़ बना सकते हैं:

require 'visual_call_graph'

VisualCallGraph.trace { "Your method call here..." }

यह एक call_graph.png उत्पन्न करता है परिणामों के साथ फाइल करें।

अपने रूबी तरीकों की जासूसी कैसे करें

ध्यान रखें कि यह स्थैतिक विश्लेषण नहीं है, यह वास्तव में विधि कहलाएगा!

फ़ाइल पथ दिखा रहा है

क्या आप जानना चाहेंगे कि इन विधियों को कहाँ परिभाषित किया गया है?

चिंता मत करो, मैंने तुम्हें कवर कर लिया है! मैंने एक विकल्प जोड़ा है जिसे आप प्रत्येक विधि कॉल के लिए फ़ाइल पथ दिखाने के लिए सक्षम कर सकते हैं।

VisualCallGraph.trace(show_path: true) { Foo.aaa }

जिसका परिणाम होता है :

अपने रूबी तरीकों की जासूसी कैसे करें

यदि आप कुछ बड़े कॉल ग्राफ़ देखना चाहते हैं तो आपको बस कुछ रेल विधियों का पता लगाना होगा 😉

रिटर्न वैल्यू

परिचय में मैंने उल्लेख किया है कि आप वापसी मूल्य भी प्राप्त कर सकते हैं…

इसके लिए आपको return . को ट्रेस करना होगा ईवेंट और return_value . का उपयोग करें विधि।

उदाहरण :

def the_method; "A" * 10; end

trace = TracePoint.new(:return) { |tp| puts "Return value for #{tp.method_id} is #{tp.return_value}." }

trace.enable
the_method
trace.disable

यह प्रिंट होगा:

Return value for the_method is AAAAAAAAAA.

पहले इवेंट

किसी ने reddit पर पूछा कि foo पर कॉल करते समय "बार" शब्द के प्रिंट होने से कैसे बचा जा सकता है? निम्नलिखित कोड में विधि:

class Thing
  def foo
    puts "foo"
    bar
  end

  def bar
    puts "bar"
  end
end

# your code here

t = Thing.new
t.foo

इसे प्राप्त करने के कई तरीके हैं, जैसे किसी मॉड्यूल को तैयार करना, $stdout . को पुनर्निर्देशित करना या bar को फिर से परिभाषित करना विधि।

<ब्लॉकक्वॉट>

यदि आप रचनात्मक महसूस कर रहे हैं, तो इस पोस्ट पर अपने विचार के साथ टिप्पणी करें!

लेकिन मुझे इनमें से एक उत्तर विशेष रूप से दिलचस्प लगा क्योंकि इसमें TracePoint . का उपयोग किया गया था कक्षा।

यह रहा :

TracePoint.trace(:call) { |tp| exit if tp.method_id == :bar }

यह कोड exit . को कॉल करेगा जब विधि bar कहा जाता है, जो प्रोग्राम को समाप्त करके स्ट्रिंग को प्रिंट होने से रोकता है।

शायद ऐसा कुछ नहीं जिसे आप वास्तविक कोड में उपयोग करना चाहते हैं, लेकिन यह TracePoint . के बारे में एक बात साबित करता है :ईवेंट होने से पहले ही ट्रिगर हो जाते हैं।

अगर आप इसके इर्द-गिर्द किसी प्रकार का टूल बनाने जा रहे हैं तो कुछ बातों का ध्यान रखें

सारांश

इस पोस्ट में आपने TracePoint . के बारे में जाना क्लास, जो आपको कुछ ईवेंट जैसे मेथड्स कॉल या नए थ्रेड्स का पता लगाने की अनुमति देता है। यह डिबगिंग टूल या कोड एक्सप्लोरेशन के लिए उपयोगी हो सकता है।

इस पोस्ट को साझा करना . याद रखें ताकि अधिक से अधिक लोग इसका आनंद उठा सकें 🙂


  1. रूबी एरे में महारत: व्यावहारिक उदाहरण और आवश्यक मेथड्स रूबी एरे में महारत: व्यावहारिक उदाहरण और आवश्यक मेथड्स

    एरे क्या है? एक एरे रूबी में एक बिल्ट-इन क्लास है, जो शून्य या अधिक आइटम्स की सूची रखती है, और इसमें ऐसे मेथड्स शामिल हैं जो आपको इन सभी आइटम्स को आसानी से जोड़ने, एक्सेस करने और लूप करने में मदद करते हैं। यह उपयोगी है, क्योंकि यदि एरे मौजूद नहीं होते तो आपको कई वेरिएबल्स का उपयोग करना पड़ता। उदाहरण

  1. हटाए गए iPhone कॉल लॉग्स को पुनर्स्थापित करें: 3 सिद्ध तरीके हटाए गए iPhone कॉल लॉग्स को पुनर्स्थापित करें: 3 सिद्ध तरीके

    iPhone कॉल लॉग्स को ज्यादातर नजरअंदाज किया जाता है जब तक आपको वास्तव में उनकी आवश्यकता न हो... दुर्भाग्य से, डिलीट किए गए फोन कॉल को पुनर्प्राप्त करना बिल्कुल सरल नहीं है। आप iPhone द्वारा अपने लॉग्स को प्रबंधित करने के तरीके को बदलने के लिए बहुत कुछ नहीं कर सकते, और कॉल्स के लिए कोई हाल ही में डिल

  1. एक्सेल में मास्टर करें: सेल डिपेंडेंट्स ट्रेस करने के 2 आसान तरीके एक्सेल में मास्टर करें: सेल डिपेंडेंट्स ट्रेस करने के 2 आसान तरीके

    एक्सेल में काम करते समय ट्रेस डिपेंडेंट्स (Trace Dependents) को समझना बहुत जरूरी है। ट्रेस डिपेंडेंसी जानने से एक्सेल यूजर को पता चलता है कि किसी सेल का डेटा दूसरी सेल्स पर कैसे निर्भर करता है। ट्रेसिंग डिपेंडेंट्स से वर्कबुक को जरूरत के समय अधिक उपयोगी बनाया जा सकता है। इस आर्टिकल में हम एक्सेल में