स्टैक ट्रेस

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

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

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

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

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

<वाक्यविन्यास प्रकाश लैंग = अजगर रेखा = 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     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 स्टैक ट्रेस दिखाता है कि त्रुटि कहां होती है, अर्थात में  फंक्शन में होती है। यह भी दर्शाता है कि   फंक्शन द्वारा संबोधित किया गया था , जिसके द्वारा संबोधित किया गया था  , जिसे बदले में प्रोग्राम की लाइन 15 (अंतिम पंक्ति) पर कोड द्वारा संबोधित किया गया था। इन तीन फंक्शन में से प्रत्येक के लिए सक्रियण रिकॉर्ड को स्टैक में व्यवस्थित किया जाएगा जैसे कि   फ़ंक्शन स्टैक के निचले भाग पर ग्रहण कर लेगा और   फंक्शन स्टैक के शीर्ष पर ग्रहण कर लेता है।

जावा
जावा (प्रोग्रामिंग लैंग्वेज) में, स्टैक ट्रेस को हस्तचालित रूप से क्रमभंग किया जा सकता है निम्नलिखित इनपुट लें: सार्वजनिक स्थैतिक शून्य 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) दोनों में स्टैक ट्रेस प्राप्त करने के लिए मूल समर्थन नहीं है, लेकिन glibc लाइब्रेरी और बूस्ट (C++ लाइब्रेरी) जैसे लाइब्रेरी यह कार्यक्षमता प्रदान करते हैं। इन भाषाओं में, कुछ कंपाइलर अनुकूलीकरण कॉल स्टैक जानकारी में हस्तक्षेप कर सकते हैं जिसे रनटाइम पर पुनर्प्राप्त किया जा सकता है। उदाहरण के लिए, इनलाइन से स्टैक फ्रेम अनुपस्थित हो सकते हैं, टेल कॉल अनुकूलीकरण स्टैक फ्रेम को दूसरे के साथ बदल सकता है, और फ्रेम पॉइंटर एलिमिनेशन कॉल स्टैक विश्लेषण टूल को कॉल स्टैक की सामग्री की सही व्याख्या करने से रोक सकता है।

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

./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 के रूप में, स्थिर मेंबर फ़ंक्शन द्वारा लौटाए गए मान को प्रिंट करके स्टैक के निशान को हस्तचालित रूप से क्रमभंग किया जा सकता है :

<वाक्यविन्यास प्रकाश लैंग = C ++> एसटीडी :: अदालत << एसटीडी :: स्टैकट्रेस :: वर्तमान << '\n'; 

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

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

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

<वाक्यविन्यास प्रकाश लैंग = रस्ट> धागा 'मुख्य' 'execute_to_panic' पर घबरा गया, main.rs:3 स्टैक बैकट्रेस: 0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace 1: एसटीडी :: पैनिकिंग :: डिफ़ॉल्ट_हुक :: 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 ... 

यह भी देखें

 * टेल कॉल
 * संदर्भ (कंप्यूटिंग)
 * स्टैक ओवरफ़्लो
 * अपवाद संचालन
 * कॉल स्टैक