स्टैक ट्रेस

From Vigyanwiki

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

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

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

भाषा समर्थन

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

पायथन

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

  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] निम्नलिखित इनपुट लें:

public class Main {
  public static void main(String args[]) {
    demo();
  }
  static void demo() {
    demo1();
  }
  static void demo1() {
    demo2();
  }
  static void demo2() {
    demo3();
  }
  static void demo3() {
    Thread.dumpStack();
  }
}

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

java.lang.Exception: Stack trace
        at java.lang.Thread.dumpStack(Thread.java:1336)
        at Main.demo3(Main.java:15)
        at Main.demo2(Main.java:12)
        at Main.demo1(Main.java:9)
        at Main.demo(Main.java:6)
        at Main.main(Main.java:3)






C और C ++

C (प्रोग्रामिंग लैंग्वेज) और C++ (प्री-C++23) दोनों में स्टैक ट्रेस प्राप्त करने के लिए मूल समर्थन नहीं है, लेकिन glibc लाइब्रेरी और बूस्ट (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]

std::cout << std::stacktrace::current() << '\n';






रस्ट

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

जून 2021 तक, रस्ट (प्रोग्रामिंग लैंग्वेज) के पास अप्राप्य त्रुटियों पर स्टैक ट्रेस के लिए प्रायोगिक समर्थन है। जब थ्रेड सन्त्रास्त होता है तो रस्ट tderr को प्रिंटिंग का समर्थन करता है, लेकिन इसेRUST_BACKTRACE पर्यावरणपरिवर्ती तारक सेट करके सक्षम किया जाना चाहिए। [10]

सक्षम होने पर, ऐसे बैकट्रेस नीचे के समान दिखते हैं, जिसमें सबसे हाल की कॉल पहले होती है।

  0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace
  1: std::panicking::default_hook::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: futures::task_impl::park
Template:Closure

यह भी देखें

संदर्भ

  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.