स्टैक ट्रेस
कम्प्यूटिंग में, एक स्टैक ट्रेस (जिसे स्टैक बैकट्रेस भी कहा जाता है[1] या स्टैक ट्रेसबैक[2]) कंप्यूटर प्रोग्राम के निष्पादन के दौरान एक निश्चित समय पर सक्रिय स्टैक फ्रेम की एक रिपोर्ट है। जब कोई प्रोग्राम चलाया जाता है, तो मेमोरी को अक्सर दो स्थानों पर गतिशील रूप से आवंटित किया जाता है; स्टैक (अमूर्त डेटा प्रकार)#हार्डवेयर स्टैक और मेमोरी_मैनेजमेंट#HEAP। स्मृति को ढेर पर लगातार आवंटित किया जाता है लेकिन ढेर पर नहीं, इस प्रकार उनके नाम प्रतिबिंबित होते हैं। स्टैक एक प्रोग्रामिंग कंस्ट्रक्शन को भी संदर्भित करता है, इस प्रकार इसे अलग करने के लिए, इस स्टैक को प्रोग्राम के कॉल स्टैक के रूप में संदर्भित किया जाता है। तकनीकी रूप से, एक बार मेमोरी का एक ब्लॉक स्टैक पर आबंटित हो जाने के बाद, इसे आसानी से हटाया नहीं जा सकता क्योंकि मेमोरी के अन्य ब्लॉक हो सकते हैं जो इससे पहले आवंटित किए गए थे। हर बार जब किसी प्रोग्राम में किसी फ़ंक्शन को कॉल किया जाता है, तो मेमोरी का एक ब्लॉक जिसे एक्टिवेशन रिकॉर्ड कहा जाता है, कॉल स्टैक के शीर्ष पर आवंटित किया जाता है। आम तौर पर, सक्रियण रिकॉर्ड फ़ंक्शन के तर्कों और स्थानीय चरों को संग्रहीत करता है। इसमें वास्तव में क्या है और इसे कैसे निर्धारित किया गया है, यह कॉलिंग कन्वेंशन द्वारा निर्धारित किया गया है।
प्रोग्रामर आमतौर पर इंटरैक्टिव और पोस्ट-मॉर्टम डिबगिंग के दौरान स्टैक ट्रेसिंग का उपयोग करते हैं। अंतिम उपयोगकर्ता एक त्रुटि संदेश के हिस्से के रूप में प्रदर्शित स्टैक ट्रेस देख सकते हैं, जिसे उपयोगकर्ता प्रोग्रामर को रिपोर्ट कर सकता है।
एक स्टैक ट्रेस नेस्टेड समारोह के अनुक्रम को ट्रैक करने की अनुमति देता है - उस बिंदु तक जहां स्टैक ट्रेस उत्पन्न होता है। पोस्ट-मॉर्टम परिदृश्य में यह उस कार्य तक विस्तारित होता है जहां विफलता हुई थी (लेकिन जरूरी नहीं था)। टेल कॉल स्टैक ट्रेस में दिखाई नहीं देता है।
भाषा समर्थन
जावा सहित कई प्रोग्रामिंग भाषाएं (प्रोग्रामिंग भाषा)[3] और सी शार्प (प्रोग्रामिंग लैंग्वेज)|सी#,[4] सिस्टम कॉल के माध्यम से वर्तमान स्टैक ट्रेस को पुनः प्राप्त करने के लिए अंतर्निहित समर्थन है। पहले std::stacktrace
के लिए एक कंटेनर के रूप में मानक पुस्तकालय में जोड़ा गया था std::stacktrace_entry
, प्री-C++23 में ऐसा करने के लिए कोई अंतर्निहित समर्थन नहीं है, लेकिन C++ उपयोगकर्ता स्टैकट्रेस पुस्तकालय (कम्प्यूटिंग) के साथ (उदाहरण के लिए) स्टैक ट्रेस प्राप्त कर सकते हैं। जावास्क्रिप्ट में, एक्सेप्शन हेंडलिंग होल्ड ए stack
संपत्ति जिसमें उस जगह से स्टैक होता है जहां इसे फेंका गया था।
पायथन
एक उदाहरण के रूप में, निम्नलिखित पायथन (प्रोग्रामिंग भाषा) प्रोग्राम में एक त्रुटि है। <वाक्यविन्यास प्रकाश लैंग = अजगर रेखा = 1 हाइलाइट = 3,9,13,15> डीईएफ़ ए ():
मैं = 0 जे = बी (मैं) वापसी जे
डेफ बी (जेड):
के = 5 अगर जेड == 0: सी() वापसी के + जेड
डीईएफ़ सी ():
गलती()
ए() </वाक्यविन्यास हाइलाइट> मानक पायथन दुभाषिया के तहत प्रोग्राम चलाने से निम्न त्रुटि संदेश उत्पन्न होता है। <वाक्यविन्यास लैंग = पीटीबी> ट्रेसबैक (सबसे हालिया कॉल अंतिम):
फाइल tb.py , लाइन 15, <मॉड्यूल> में ए() फ़ाइल tb.py , पंक्ति 3, a में जे = बी (मैं) फ़ाइल tb.py , लाइन 9, बी में सी() फ़ाइल tb.py , लाइन 13, c में गलती()
NameError: नाम 'त्रुटि' परिभाषित नहीं है
</वाक्यविन्यास हाइलाइट>
स्टैक ट्रेस दिखाता है कि त्रुटि कहां होती है, अर्थात में c
समारोह। यह भी दर्शाता है कि c
समारोह द्वारा बुलाया गया था b
, जिसके द्वारा बुलाया गया था a
, जिसे बदले में प्रोग्राम की लाइन 15 (अंतिम पंक्ति) पर कोड द्वारा बुलाया गया था। इन तीन कार्यों में से प्रत्येक के लिए सक्रियण रिकॉर्ड को एक ढेर में व्यवस्थित किया जाएगा जैसे कि a
फ़ंक्शन स्टैक के निचले भाग पर कब्जा कर लेगा और c
समारोह ढेर के शीर्ष पर कब्जा कर लेगा।
जावा
जावा (प्रोग्रामिंग लैंग्वेज) में, स्टैक ट्रेस को मैन्युअल रूप से डंप किया जा सकता है Thread.dumpStack()
[5] निम्नलिखित इनपुट लें:
<वाक्यविन्यास प्रकाश लैंग = जावा लाइन = 1 हाइलाइट = 3,6,12,15>
सार्वजनिक वर्ग मुख्य {
सार्वजनिक स्थैतिक शून्य main (String [] args[]) { डेमो (); } स्थिर शून्य डेमो () { डेमो 1 (); } स्थिर शून्य डेमो 1 () { डेमो 2 (); } स्थिर शून्य डेमो 2 () { डेमो 3 (); } स्थिर शून्य डेमो 3 () { थ्रेड.डंपस्टैक (); }
} </वाक्यविन्यास हाइलाइट>
अपवाद अवरोही क्रम में कार्यों को सूचीबद्ध करता है, इसलिए सबसे आंतरिक कॉल पहले है।
<वाक्यविन्यास प्रकाश लैंग = जावा> java.lang.Exception: स्टैक ट्रेस
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++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]
</वाक्यविन्यास हाइलाइट>
सी ++ 23 के रूप में, स्थिर सदस्य फ़ंक्शन द्वारा लौटाए गए मान को प्रिंट करके स्टैक के निशान को मैन्युअल रूप से डंप किया जा सकता है std::stacktrace::current()
:[8]
<वाक्यविन्यास प्रकाश लैंग = सी ++>
एसटीडी :: अदालत << एसटीडी :: स्टैकट्रेस :: वर्तमान () << '\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 ... </वाक्यविन्यास हाइलाइटर>
यह भी देखें
- टेल कॉल
- संदर्भ (कंप्यूटिंग)
- स्टैक ओवरफ़्लो
- एक्सेप्शन हेंडलिंग
- कॉल स्टैक
संदर्भ
- ↑ "libc manual: backtraces". gnu.org. Retrieved 8 July 2014.
- ↑ "traceback — Print or retrieve a stack traceback". python.org. Retrieved 8 July 2014.
- ↑ "Thread (Java SE 16 & JDK 16)". Java Platform Standard Edition & Java Development Kit Version 16 API Specification. 2021-03-04. Retrieved 2021-07-04.
- ↑ "Environment.StackTrace Property (System)". Microsoft Docs. 2021-05-07. Retrieved 2021-07-04.
- ↑ "Thread (Java Platform SE 8 )". docs.oracle.com. Retrieved 2021-06-15.
- ↑ 6.0 6.1 "Backtraces (The GNU C Library)". www.gnu.org. Retrieved 2021-06-15.
- ↑ "Getting Started - 1.76.0". www.boost.org. Retrieved 2021-06-15.
- ↑ "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) - ↑ "rustonomicon unwinding - Rust". doc.rust-lang.org.
- ↑ "std::backtrace - Rust". doc.rust-lang.org. Retrieved 2021-06-15.