स्टैक ट्रेस

From Vigyanwiki
Revision as of 16:54, 27 February 2023 by alpha>Nitya (text)

कम्प्यूटिंग में, स्टैक ट्रेस (जिसे स्टैक बैकट्रेस भी कहा जाता है[1] या स्टैक ट्रेसबैक[2]) कंप्यूटर प्रोग्राम के निष्पादन के दौरान निश्चित समय पर सक्रिय स्टैक फ्रेम की आख्या है। जब कोई प्रोग्राम चलाया जाता है, तो मेमोरी को अक्सर दो स्थानों पर गतिशील रूप से आवंटित किया जाता है; स्टैक (अमूर्त डेटा प्रकार) और हीप (मेमोरी_मैनेजमेंट) है। स्मृति को स्टैक पर लगातार आवंटित किया जाता है लेकिन हीप पर नहीं, इस प्रकार उनके नाम प्रतिबिंबित होते हैं। स्टैक एक प्रोग्रामिंग संरचना को भी संदर्भित करता है, इस प्रकार इसे अलग करने के लिए, इस स्टैक को प्रोग्राम के कॉल स्टैक के रूप में संदर्भित किया जाता है। तकनीकी रूप से, एक बार मेमोरी का ब्लॉक स्टैक पर आबंटित हो जाने के बाद, इसे आसानी से हटाया नहीं जा सकता क्योंकि मेमोरी के अन्य ब्लॉक हो सकते हैं जो इससे पहले आवंटित किए गए थे। हर बार जब किसी प्रोग्राम में किसी फ़ंक्शन को कॉल किया जाता है, तो मेमोरी का ब्लॉक जिसे एक्टिवेशन रिकॉर्ड कहा जाता है, कॉल स्टैक के शीर्ष पर आवंटित किया जाता है। आम तौर पर, सक्रियण रिकॉर्ड फ़ंक्शन के तर्कों और स्थानीय चरों को संग्रहीत करता है। इसमें वास्तव में क्या है और इसे कैसे निर्धारित किया गया है, यह कॉलिंग कन्वेंशन द्वारा निर्धारित किया गया है।

प्रोग्रामर आमतौर पर पारस्परिक और समीक्षा दोषमार्जन के दौरान स्टैक ट्रेसिंग का उपयोग करते हैं। अंतिम उपयोगकर्ता त्रुटि संदेश के हिस्से के रूप में प्रदर्शित स्टैक ट्रेस देख सकते हैं, जिसे उपयोगकर्ता प्रोग्रामर को आख्या कर सकता है।

स्टैक ट्रेस नेस्टेड फंक्शन के अनुक्रम को पता करने की अनुमति देता है - उस बिंदु तक जहां स्टैक ट्रेस उत्पन्न होता है। समीक्षा परिदृश्य में यह उस फंक्शन तक विस्तारित होता है जहां विफलता हुई थी (लेकिन जरूरी नहीं था)। टेल कॉल स्टैक ट्रेस में दिखाई नहीं देता है।

भाषा समर्थन

कई प्रोग्रामिंग भाषाएं जावा (प्रोग्रामिंग भाषा)[3] और C# (प्रोग्रामिंग लैंग्वेज),[4] सिस्टम कॉल के माध्यम से वर्तमान स्टैक ट्रेस को पुनः प्राप्त करने के लिए अंतर्निहित समर्थन है। पहले std::stacktrace के लिए कंटेनर के रूप में मानक लाइब्रेरी में जोड़ा गया था std::stacktrace_entry, प्री-C++23 में ऐसा करने के लिए कोई अंतर्निहित समर्थन नहीं है, लेकिन C++ उपयोगकर्ता स्टैकट्रेस लाइब्रेरी (कम्प्यूटिंग) के साथ (उदाहरण के लिए) स्टैक ट्रेस प्राप्त कर सकते हैं। जावास्क्रिप्ट में, अपवाद संचालन stack गुण को नियन्त्रित रखता है जिसमें उस जगह से स्टैक होता है जहां इसे प्रक्षेप किया गया था।

पायथन

उदाहरण के रूप में, निम्नलिखित पायथन (प्रोग्रामिंग भाषा) प्रोग्राम में एक त्रुटि है।

<वाक्यविन्यास प्रकाश लैंग = अजगर रेखा = 1 हाइलाइट = 3,9,13,15> डीईएफ़ ए ():

  def a():
    i = 0
    j = b(i)
    return j

def b(z):
    k = 5
    if z == 0:
        c()
    return k + z

def c():
    error()

a()

मानक पायथन दुभाषिया के तहत प्रोग्राम चलाने से निम्न त्रुटि संदेश उत्पन्न होता है।

 Traceback (most recent call last):
  File "tb.py", line 15, in <module>
    a()
  File "tb.py", line 3, in a
    j = b(i)
  File "tb.py", line 9, in b
    c()
  File "tb.py", line 13, in c
    error()
NameError: name 'error' is not defined

स्टैक ट्रेस दिखाता है कि त्रुटि कहां होती है, अर्थात में c फंक्शन में होती है। यह भी दर्शाता है कि c फंक्शन द्वारा संबोधित किया गया था b, जिसके द्वारा संबोधित किया गया था a, जिसे बदले में प्रोग्राम की लाइन 15 (अंतिम पंक्ति) पर कोड द्वारा संबोधित किया गया था। इन तीन फंक्शन में से प्रत्येक के लिए सक्रियण रिकॉर्ड को स्टैक में व्यवस्थित किया जाएगा जैसे कि a फ़ंक्शन स्टैक के निचले भाग पर ग्रहण कर लेगा और c फंक्शन स्टैक के शीर्ष पर ग्रहण कर लेता है।

जावा

जावा (प्रोग्रामिंग लैंग्वेज) में, स्टैक ट्रेस को हस्तचालित रूप से क्रमभंग किया जा सकता है Thread.dumpStack()[5] निम्नलिखित इनपुट लें:

 सार्वजनिक स्थैतिक शून्य main (String [] args[]) {
   डेमो ();
 }
 स्थिर शून्य डेमो () {
   डेमो 1 ();
 }
 स्थिर शून्य डेमो 1 () {
   डेमो 2 ();
 }
 स्थिर शून्य डेमो 2 () {
   डेमो 3 ();
 }
 स्थिर शून्य डेमो 3 () {
   थ्रेड.डंपस्टैक ();
 }

अपवाद अवरोही क्रम में फंक्शन को सूचीबद्ध करता है, इसलिए सबसे आंतरिक कॉल पहले है।

       java.lang.Thread.dumpStack (Thread.java:1336) पर
       Main.demo3 पर (Main.java:15)
       Main.demo2 पर (Main.java:12)
       Main.demo1 पर (Main.java:9)
       Main.demo पर (Main.java:6)
       Main.main पर (Main.Java:3)

</वाक्यविन्यास हाइलाइट>

C और C ++

C (प्रोग्रामिंग लैंग्वेज) और C++ (प्री-C++23) दोनों में स्टैक ट्रेस प्राप्त करने के लिए मूल समर्थन नहीं है, लेकिन GNU C लाइब्रेरी और बूस्ट (C++ लाइब्रेरी) जैसे लाइब्रेरी यह कार्यक्षमता प्रदान करते हैं।[6][7] इन भाषाओं में, कुछ कंपाइलर ऑप्टिमाइज़ेशन कॉल स्टैक जानकारी में हस्तक्षेप कर सकते हैं जिसे रनटाइम पर पुनर्प्राप्त किया जा सकता है। उदाहरण के लिए, इनलाइन विस्तार से स्टैक फ्रेम गायब हो सकते हैं, टेल कॉल ऑप्टिमाइज़ेशन एक स्टैक फ्रेम को दूसरे के साथ बदल सकता है, और फ्रेम पॉइंटर एलिमिनेशन कॉल स्टैक विश्लेषण टूल को कॉल स्टैक की सामग्री की सही व्याख्या करने से रोक सकता है।[6]

उदाहरण के लिए, ग्लिबैक backtrace() फ़ंक्शन प्रोग्राम फ़ंक्शन और मेमोरी एड्रेस के साथ आउटपुट देता है।

./a.out() [0x40067f] ./a.out() [0x4006fe] ./a.out() [0x40070a] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f7e60738f45] ./a.out() [0x400599]

C ++ 23 के रूप में, स्थिर सदस्य फ़ंक्शन द्वारा लौटाए गए मान को प्रिंट करके स्टैक के निशान को हस्तचालित रूप से क्रमभंग किया जा सकता है std::stacktrace::current():[8] <वाक्यविन्यास प्रकाश लैंग = C ++> एसटीडी :: अदालत << एसटीडी :: स्टैकट्रेस :: वर्तमान () << '\n'; </वाक्यविन्यास हाइलाइट>

जंग

जंग (प्रोग्रामिंग भाषा) में दो तरह की एरर होती है। पैनिक मैक्रो (कंप्यूटर विज्ञान) का उपयोग करने वाले फंक्शन अप्राप्य हैं और वर्तमान थ्रेड स्टैक अनवाइंडिंग का अनुभव करते हुए जहरीला हो जाएगा। फ़ंक्शन जो ए लौटाते हैं std::result::Result पुनर्प्राप्त करने योग्य हैं और इनायत से संभाला जा सकता है।[9] हालाँकि, पुनर्प्राप्त करने योग्य त्रुटियाँ स्टैक ट्रेस उत्पन्न नहीं कर सकती हैं क्योंकि वे हस्तचालित रूप से जोड़े गए हैं और रनटाइम त्रुटि का परिणाम नहीं हैं।

जून 2021 तक, रस्ट (प्रोग्रामिंग लैंग्वेज) के पास अप्राप्य त्रुटियों पर स्टैक ट्रेस के लिए प्रायोगिक समर्थन है। जब थ्रेड पैनिक होता है तो रस्ट tderr को प्रिंटिंग का समर्थन करता है, लेकिन इसे सेट करके सक्षम किया जाना चाहिए RUST_BACKTRACE पर्यावरणपरिवर्ती तारक[10] सक्षम होने पर, ऐसे बैकट्रेस नीचे के समान दिखते हैं, जिसमें सबसे हाल की कॉल पहले होती है। <वाक्यविन्यास प्रकाश लैंग = जंग> धागा 'मुख्य' 'execute_to_panic' पर घबरा गया, main.rs:3 स्टैक बैकट्रेस:

  0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace
  1: एसटीडी :: पैनिकिंग :: डिफ़ॉल्ट_हुक ::Template:Closure

2: std::panicking::default_hook 3: std::panicking::rust_panic_with_hook 4: std::panicking::begin_panic 5: futures::task_impl::with 6: features::task_impl::park ... </वाक्यविन्यास हाइलाइटर>

यह भी देखें

संदर्भ

  1. "libc manual: backtraces". gnu.org. Retrieved 8 July 2014.
  2. "traceback — Print or retrieve a stack traceback". python.org. Retrieved 8 July 2014.
  3. "Thread (Java SE 16 & JDK 16)". Java Platform Standard Edition & Java Development Kit Version 16 API Specification. 2021-03-04. Retrieved 2021-07-04.
  4. "Environment.StackTrace Property (System)". Microsoft Docs. 2021-05-07. Retrieved 2021-07-04.
  5. "Thread (Java Platform SE 8 )". docs.oracle.com. Retrieved 2021-06-15.
  6. 6.0 6.1 "Backtraces (The GNU C Library)". www.gnu.org. Retrieved 2021-06-15.
  7. "Getting Started - 1.76.0". www.boost.org. Retrieved 2021-06-15.
  8. "Working Draft, Standard for Programming Language C++" (PDF). open-std.org. ISO/IEC. 2021-10-23. p. 766.{{cite web}}: CS1 maint: url-status (link)
  9. "rustonomicon unwinding - Rust". doc.rust-lang.org.
  10. "std::backtrace - Rust". doc.rust-lang.org. Retrieved 2021-06-15.