स्टैक ट्रेस: Difference between revisions

From Vigyanwiki
(Created page with "{{Redirect|Backtrace|the 2018 film|Backtrace (film)}} कम्प्यूटिंग में, एक स्टैक ट्रेस (जिसे स्टैक ब...")
 
(text)
Line 1: Line 1:
{{Redirect|Backtrace|the 2018 film|Backtrace (film)}}
{{Redirect|पश्व-अनुरेखन|2018 की फिल्म|बैकट्रेस (फिल्म)}}
[[कम्प्यूटिंग]] में, एक स्टैक ट्रेस (जिसे स्टैक बैकट्रेस भी कहा जाता है<ref>{{cite web | url=https://www.gnu.org/software/libc/manual/html_node/Backtraces.html | title=libc manual: backtraces | publisher=gnu.org | accessdate=8 July 2014}}</ref> या स्टैक ट्रेसबैक<ref>{{cite web | url=https://docs.python.org/3/library/traceback.html | title=traceback — Print or retrieve a stack traceback | publisher=python.org | accessdate=8 July 2014}}</ref>) [[कंप्यूटर प्रोग्राम]] के निष्पादन के दौरान एक निश्चित समय पर सक्रिय [[स्टैक फ्रेम]] की एक रिपोर्ट है। जब कोई प्रोग्राम चलाया जाता है, तो मेमोरी को अक्सर दो स्थानों पर गतिशील रूप से आवंटित किया जाता है; स्टैक (अमूर्त डेटा प्रकार)#हार्डवेयर स्टैक और मेमोरी_मैनेजमेंट#HEAP। स्मृति को ढेर पर लगातार आवंटित किया जाता है लेकिन ढेर पर नहीं, इस प्रकार उनके नाम प्रतिबिंबित होते हैं। स्टैक एक प्रोग्रामिंग कंस्ट्रक्शन को भी संदर्भित करता है, इस प्रकार इसे अलग करने के लिए, इस स्टैक को प्रोग्राम के [[कॉल स्टैक]] के रूप में संदर्भित किया जाता है। तकनीकी रूप से, एक बार मेमोरी का एक ब्लॉक स्टैक पर आबंटित हो जाने के बाद, इसे आसानी से हटाया नहीं जा सकता क्योंकि मेमोरी के अन्य ब्लॉक हो सकते हैं जो इससे पहले आवंटित किए गए थे। हर बार जब किसी प्रोग्राम में किसी फ़ंक्शन को कॉल किया जाता है, तो मेमोरी का एक ब्लॉक जिसे एक्टिवेशन रिकॉर्ड कहा जाता है, कॉल स्टैक के शीर्ष पर आवंटित किया जाता है। आम तौर पर, सक्रियण रिकॉर्ड फ़ंक्शन के तर्कों और स्थानीय चरों को संग्रहीत करता है। इसमें वास्तव में क्या है और इसे कैसे निर्धारित किया गया है, यह [[कॉलिंग कन्वेंशन]] द्वारा निर्धारित किया गया है।
[[कम्प्यूटिंग]] में, स्टैक ट्रेस (जिसे स्टैक बैकट्रेस भी कहा जाता है<ref>{{cite web | url=https://www.gnu.org/software/libc/manual/html_node/Backtraces.html | title=libc manual: backtraces | publisher=gnu.org | accessdate=8 July 2014}}</ref> या स्टैक ट्रेसबैक<ref>{{cite web | url=https://docs.python.org/3/library/traceback.html | title=traceback — Print or retrieve a stack traceback | publisher=python.org | accessdate=8 July 2014}}</ref>) [[कंप्यूटर प्रोग्राम]] के निष्पादन के दौरान निश्चित समय पर सक्रिय [[स्टैक फ्रेम]] की आख्या है। जब कोई प्रोग्राम चलाया जाता है, तो मेमोरी को अक्सर दो स्थानों पर गतिशील रूप से आवंटित किया जाता है; स्टैक (अमूर्त डेटा प्रकार) और हीप (मेमोरी_मैनेजमेंट) है। स्मृति को स्टैक पर लगातार आवंटित किया जाता है लेकिन हीप पर नहीं, इस प्रकार उनके नाम प्रतिबिंबित होते हैं। स्टैक एक प्रोग्रामिंग संरचना को भी संदर्भित करता है, इस प्रकार इसे अलग करने के लिए, इस स्टैक को प्रोग्राम के [[कॉल स्टैक]] के रूप में संदर्भित किया जाता है। तकनीकी रूप से, एक बार मेमोरी का ब्लॉक स्टैक पर आबंटित हो जाने के बाद, इसे आसानी से हटाया नहीं जा सकता क्योंकि मेमोरी के अन्य ब्लॉक हो सकते हैं जो इससे पहले आवंटित किए गए थे। हर बार जब किसी प्रोग्राम में किसी फ़ंक्शन को कॉल किया जाता है, तो मेमोरी का ब्लॉक जिसे एक्टिवेशन रिकॉर्ड कहा जाता है, कॉल स्टैक के शीर्ष पर आवंटित किया जाता है। आम तौर पर, सक्रियण रिकॉर्ड फ़ंक्शन के तर्कों और स्थानीय चरों को संग्रहीत करता है। इसमें वास्तव में क्या है और इसे कैसे निर्धारित किया गया है, यह [[कॉलिंग कन्वेंशन]] द्वारा निर्धारित किया गया है।


प्रोग्रामर आमतौर पर इंटरैक्टिव और पोस्ट-मॉर्टम [[डिबगिंग]] के दौरान स्टैक ट्रेसिंग का उपयोग करते हैं। अंतिम उपयोगकर्ता एक [[त्रुटि संदेश]] के हिस्से के रूप में प्रदर्शित स्टैक ट्रेस देख सकते हैं, जिसे उपयोगकर्ता प्रोग्रामर को रिपोर्ट कर सकता है।
प्रोग्रामर आमतौर पर पारस्परिक और समीक्षा [[डिबगिंग|दोषमार्जन]] के दौरान स्टैक ट्रेसिंग का उपयोग करते हैं। अंतिम उपयोगकर्ता [[त्रुटि संदेश]] के हिस्से के रूप में प्रदर्शित स्टैक ट्रेस देख सकते हैं, जिसे उपयोगकर्ता प्रोग्रामर को आख्या कर सकता है।


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


== भाषा समर्थन ==
== भाषा समर्थन ==
जावा सहित कई प्रोग्रामिंग भाषाएं (प्रोग्रामिंग भाषा)<ref>{{cite web | title=Thread (Java SE 16 & JDK 16) | website=Java Platform Standard Edition & Java Development Kit Version 16 API Specification | date=2021-03-04 | url=https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Thread.html#getStackTrace() | access-date=2021-07-04}}</ref> और सी शार्प (प्रोग्रामिंग लैंग्वेज)|सी#,<ref>{{cite web | title=Environment.StackTrace Property (System) | website=Microsoft Docs | date=2021-05-07 | url=https://docs.microsoft.com/en-us/dotnet/api/system.environment.stacktrace | access-date=2021-07-04}}</ref> सिस्टम कॉल के माध्यम से वर्तमान स्टैक ट्रेस को पुनः प्राप्त करने के लिए अंतर्निहित समर्थन है। पहले <code>std::stacktrace</code> के लिए एक कंटेनर के रूप में मानक पुस्तकालय में जोड़ा गया था <code>std::stacktrace_entry</code>, प्री-[[C++23]] में ऐसा करने के लिए कोई अंतर्निहित समर्थन नहीं है, लेकिन C++ उपयोगकर्ता [http://stacktrace.sourceforge.net/ स्टैकट्रेस] [[पुस्तकालय (कम्प्यूटिंग)]] के साथ (उदाहरण के लिए) स्टैक ट्रेस प्राप्त कर सकते हैं। [[जावास्क्रिप्ट]] में, [[एक्सेप्शन हेंडलिंग]] होल्ड ए <code>stack</code> संपत्ति जिसमें उस जगह से स्टैक होता है जहां इसे फेंका गया था।
कई प्रोग्रामिंग भाषाएं जावा (प्रोग्रामिंग भाषा)<ref>{{cite web | title=Thread (Java SE 16 & JDK 16) | website=Java Platform Standard Edition & Java Development Kit Version 16 API Specification | date=2021-03-04 | url=https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Thread.html#getStackTrace() | access-date=2021-07-04}}</ref> और C# (प्रोग्रामिंग लैंग्वेज),<ref>{{cite web | title=Environment.StackTrace Property (System) | website=Microsoft Docs | date=2021-05-07 | url=https://docs.microsoft.com/en-us/dotnet/api/system.environment.stacktrace | access-date=2021-07-04}}</ref> सिस्टम कॉल के माध्यम से वर्तमान स्टैक ट्रेस को पुनः प्राप्त करने के लिए अंतर्निहित समर्थन है। पहले <code>std::stacktrace</code> के लिए कंटेनर के रूप में मानक लाइब्रेरी में जोड़ा गया था <code>std::stacktrace_entry</code>, प्री-[[C++23]] में ऐसा करने के लिए कोई अंतर्निहित समर्थन नहीं है, लेकिन C++ उपयोगकर्ता [http://stacktrace.sourceforge.net/ स्टैकट्रेस] [[पुस्तकालय (कम्प्यूटिंग)|लाइब्रेरी (कम्प्यूटिंग)]] के साथ (उदाहरण के लिए) स्टैक ट्रेस प्राप्त कर सकते हैं। [[जावास्क्रिप्ट]] में, [[एक्सेप्शन हेंडलिंग|अपवाद संचालन]] <code>stack</code> गुण को नियन्त्रित रखता है जिसमें उस जगह से स्टैक होता है जहां इसे प्रक्षेप किया गया था।


=== पायथन ===
=== पायथन ===
एक उदाहरण के रूप में, निम्नलिखित [[पायथन (प्रोग्रामिंग भाषा)]] प्रोग्राम में एक त्रुटि है।
उदाहरण के रूप में, निम्नलिखित [[पायथन (प्रोग्रामिंग भाषा)]] प्रोग्राम में एक त्रुटि है।
 
<वाक्यविन्यास प्रकाश लैंग = अजगर रेखा = 1 हाइलाइट = 3,9,13,15>
<वाक्यविन्यास प्रकाश लैंग = अजगर रेखा = 1 हाइलाइट = 3,9,13,15>
डीईएफ़ ए ():
डीईएफ़ ए ():
    मैं = 0
  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()


डेफ बी (जेड):
मानक पायथन दुभाषिया के तहत प्रोग्राम चलाने से निम्न त्रुटि संदेश उत्पन्न होता है।
    के = 5
  Traceback (most recent call last):
    अगर जेड == 0:
        सी()
    वापसी के + जेड
 
डीईएफ़ सी ():
    गलती()


ए()
  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
  फाइल tb.py , लाइन 15, <मॉड्यूल> में
    c()
    ए()
  File "tb.py", line 13, in c
  फ़ाइल tb.py , पंक्ति 3, a में
    error()
    जे = बी (मैं)
NameError: name 'error' is not defined
  फ़ाइल tb.py , लाइन 9, बी में
स्टैक ट्रेस दिखाता है कि त्रुटि कहां होती है, अर्थात में <code>c</code> फंक्शन में होती है। यह भी दर्शाता है कि <code>c</code> फंक्शन द्वारा संबोधित किया गया था <code>b</code>, जिसके द्वारा संबोधित किया गया था <code>a</code>, जिसे बदले में प्रोग्राम की लाइन 15 (अंतिम पंक्ति) पर कोड द्वारा संबोधित किया गया था। इन तीन फंक्शन में से प्रत्येक के लिए सक्रियण रिकॉर्ड को स्टैक में व्यवस्थित किया जाएगा जैसे कि <code>a</code> फ़ंक्शन स्टैक के निचले भाग पर ग्रहण कर लेगा और <code>c</code> फंक्शन स्टैक के शीर्ष पर ग्रहण कर लेता है।
    सी()
  फ़ाइल tb.py , लाइन 13, c में
    गलती()
NameError: नाम 'त्रुटि' परिभाषित नहीं है
</वाक्यविन्यास हाइलाइट>
स्टैक ट्रेस दिखाता है कि त्रुटि कहां होती है, अर्थात में <code>c</code> समारोह। यह भी दर्शाता है कि <code>c</code> समारोह द्वारा बुलाया गया था <code>b</code>, जिसके द्वारा बुलाया गया था <code>a</code>, जिसे बदले में प्रोग्राम की लाइन 15 (अंतिम पंक्ति) पर कोड द्वारा बुलाया गया था। इन तीन कार्यों में से प्रत्येक के लिए सक्रियण रिकॉर्ड को एक ढेर में व्यवस्थित किया जाएगा जैसे कि <code>a</code> फ़ंक्शन स्टैक के निचले भाग पर कब्जा कर लेगा और <code>c</code> समारोह ढेर के शीर्ष पर कब्जा कर लेगा।


=== जावा ===
=== जावा ===
जावा (प्रोग्रामिंग लैंग्वेज) में, स्टैक ट्रेस को मैन्युअल रूप से डंप किया जा सकता है <code>Thread.dumpStack()</code><ref>{{Cite web|title=Thread (Java Platform SE 8 )|url=https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#dumpStack--|access-date=2021-06-15|website=docs.oracle.com}}</ref> निम्नलिखित इनपुट लें:
जावा (प्रोग्रामिंग लैंग्वेज) में, स्टैक ट्रेस को हस्तचालित रूप से क्रमभंग किया जा सकता है <code>Thread.dumpStack()</code><ref>{{Cite web|title=Thread (Java Platform SE 8 )|url=https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#dumpStack--|access-date=2021-06-15|website=docs.oracle.com}}</ref> निम्नलिखित इनपुट लें:
<वाक्यविन्यास प्रकाश लैंग = जावा लाइन = 1 हाइलाइट = 3,6,12,15>
सार्वजनिक वर्ग मुख्य {
   सार्वजनिक स्थैतिक शून्य main (String [] args[]) {
   सार्वजनिक स्थैतिक शून्य main (String [] args[]) {
     डेमो ();
     डेमो ();
Line 62: Line 61:
     थ्रेड.डंपस्टैक ();
     थ्रेड.डंपस्टैक ();
   }
   }
}
अपवाद अवरोही क्रम में फंक्शन को सूचीबद्ध करता है, इसलिए सबसे आंतरिक कॉल पहले है।
</वाक्यविन्यास हाइलाइट>
 
अपवाद अवरोही क्रम में कार्यों को सूचीबद्ध करता है, इसलिए सबसे आंतरिक कॉल पहले है।
 
<वाक्यविन्यास प्रकाश लैंग = जावा>
java.lang.Exception: स्टैक ट्रेस
         java.lang.Thread.dumpStack (Thread.java:1336) पर
         java.lang.Thread.dumpStack (Thread.java:1336) पर
         Main.demo3 पर (Main.java:15)
         Main.demo3 पर (Main.java:15)
Line 77: Line 70:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


=== सी और [[सी ++]] ===
=== C और [[सी ++|C ++]] ===
C (प्रोग्रामिंग लैंग्वेज) और C++ (प्री-C++23) दोनों में स्टैक ट्रेस प्राप्त करने के लिए मूल समर्थन नहीं है, लेकिन GNU C लाइब्रेरी और बूस्ट (C++ लाइब्रेरी) जैसे पुस्तकालय यह कार्यक्षमता प्रदान करते हैं।<ref name="glibc Backtraces">{{Cite web|title=Backtraces (The GNU C Library)|url=https://www.gnu.org/software/libc/manual/html_node/Backtraces.html|access-date=2021-06-15|website=www.gnu.org}}</ref><ref>{{Cite web|title=Getting Started - 1.76.0|url=https://www.boost.org/doc/libs/1_76_0/doc/html/stacktrace/getting_started.html|access-date=2021-06-15|website=www.boost.org}}</ref> इन भाषाओं में, कुछ कंपाइलर ऑप्टिमाइज़ेशन कॉल स्टैक जानकारी में हस्तक्षेप कर सकते हैं जिसे रनटाइम पर पुनर्प्राप्त किया जा सकता है। उदाहरण के लिए, [[इनलाइन विस्तार]] से स्टैक फ्रेम गायब हो सकते हैं, टेल कॉल ऑप्टिमाइज़ेशन एक स्टैक फ्रेम को दूसरे के साथ बदल सकता है, और फ्रेम पॉइंटर एलिमिनेशन कॉल स्टैक विश्लेषण टूल को कॉल स्टैक की सामग्री की सही व्याख्या करने से रोक सकता है।<ref name="glibc Backtraces" />
C (प्रोग्रामिंग लैंग्वेज) और C++ (प्री-C++23) दोनों में स्टैक ट्रेस प्राप्त करने के लिए मूल समर्थन नहीं है, लेकिन GNU C लाइब्रेरी और बूस्ट (C++ लाइब्रेरी) जैसे लाइब्रेरी यह कार्यक्षमता प्रदान करते हैं।<ref name="glibc Backtraces">{{Cite web|title=Backtraces (The GNU C Library)|url=https://www.gnu.org/software/libc/manual/html_node/Backtraces.html|access-date=2021-06-15|website=www.gnu.org}}</ref><ref>{{Cite web|title=Getting Started - 1.76.0|url=https://www.boost.org/doc/libs/1_76_0/doc/html/stacktrace/getting_started.html|access-date=2021-06-15|website=www.boost.org}}</ref> इन भाषाओं में, कुछ कंपाइलर ऑप्टिमाइज़ेशन कॉल स्टैक जानकारी में हस्तक्षेप कर सकते हैं जिसे रनटाइम पर पुनर्प्राप्त किया जा सकता है। उदाहरण के लिए, [[इनलाइन विस्तार]] से स्टैक फ्रेम गायब हो सकते हैं, टेल कॉल ऑप्टिमाइज़ेशन एक स्टैक फ्रेम को दूसरे के साथ बदल सकता है, और फ्रेम पॉइंटर एलिमिनेशन कॉल स्टैक विश्लेषण टूल को कॉल स्टैक की सामग्री की सही व्याख्या करने से रोक सकता है।<ref name="glibc Backtraces" />


उदाहरण के लिए, ग्लिबैक <code>backtrace()</code> फ़ंक्शन प्रोग्राम फ़ंक्शन और मेमोरी एड्रेस के साथ आउटपुट देता है।
उदाहरण के लिए, ग्लिबैक <code>backtrace()</code> फ़ंक्शन प्रोग्राम फ़ंक्शन और मेमोरी एड्रेस के साथ आउटपुट देता है।
<वाक्यविन्यास प्रकाश लैंग = सी>
 
./a.out() [0x40067f]
./a.out() [0x40067f]
./a.out() [0x4006fe]
./a.out() [0x4006fe]
Line 87: Line 80:
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f7e60738f45]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f7e60738f45]
./a.out() [0x400599]
./a.out() [0x400599]
</वाक्यविन्यास हाइलाइट>


सी ++ 23 के रूप में, स्थिर सदस्य फ़ंक्शन द्वारा लौटाए गए मान को प्रिंट करके स्टैक के निशान को मैन्युअल रूप से डंप किया जा सकता है <code>std::stacktrace::current()</code>:<ref>{{Cite web|date=2021-10-23|title=Working Draft, Standard for Programming Language C++|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2020/n4901.pdf|url-status=live|website=open-std.org|publisher=ISO/IEC|page=766}}</ref>
C ++ 23 के रूप में, स्थिर सदस्य फ़ंक्शन द्वारा लौटाए गए मान को प्रिंट करके स्टैक के निशान को हस्तचालित रूप से क्रमभंग किया जा सकता है <code>std::stacktrace::current()</code>:<ref>{{Cite web|date=2021-10-23|title=Working Draft, Standard for Programming Language C++|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2020/n4901.pdf|url-status=live|website=open-std.org|publisher=ISO/IEC|page=766}}</ref>
<वाक्यविन्यास प्रकाश लैंग = सी ++>
<वाक्यविन्यास प्रकाश लैंग = C ++>
एसटीडी :: अदालत << एसटीडी :: स्टैकट्रेस :: वर्तमान () << '\n';
एसटीडी :: अदालत << एसटीडी :: स्टैकट्रेस :: वर्तमान () << '\n';
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


=== जंग ===
=== जंग ===
[[जंग (प्रोग्रामिंग भाषा)]] में दो तरह की एरर होती है। पैनिक [[मैक्रो (कंप्यूटर विज्ञान)]] का उपयोग करने वाले कार्य अप्राप्य हैं और वर्तमान थ्रेड स्टैक अनवाइंडिंग का अनुभव करते हुए जहरीला हो जाएगा। फ़ंक्शन जो ए लौटाते हैं <code>std::result::Result</code> पुनर्प्राप्त करने योग्य हैं और इनायत से संभाला जा सकता है।<ref>{{Cite web|title=rustonomicon unwinding - Rust|url=https://doc.rust-lang.org/nomicon/unwinding.html#:~:text=Rust%20has%20a%20tiered%20error,be%20handled%2C%20the%20thread%20panics.|website=doc.rust-lang.org}}</ref> हालाँकि, पुनर्प्राप्त करने योग्य त्रुटियाँ स्टैक ट्रेस उत्पन्न नहीं कर सकती हैं क्योंकि वे मैन्युअल रूप से जोड़े गए हैं और रनटाइम त्रुटि का परिणाम नहीं हैं।
[[जंग (प्रोग्रामिंग भाषा)]] में दो तरह की एरर होती है। पैनिक [[मैक्रो (कंप्यूटर विज्ञान)]] का उपयोग करने वाले फंक्शन अप्राप्य हैं और वर्तमान थ्रेड स्टैक अनवाइंडिंग का अनुभव करते हुए जहरीला हो जाएगा। फ़ंक्शन जो ए लौटाते हैं <code>std::result::Result</code> पुनर्प्राप्त करने योग्य हैं और इनायत से संभाला जा सकता है।<ref>{{Cite web|title=rustonomicon unwinding - Rust|url=https://doc.rust-lang.org/nomicon/unwinding.html#:~:text=Rust%20has%20a%20tiered%20error,be%20handled%2C%20the%20thread%20panics.|website=doc.rust-lang.org}}</ref> हालाँकि, पुनर्प्राप्त करने योग्य त्रुटियाँ स्टैक ट्रेस उत्पन्न नहीं कर सकती हैं क्योंकि वे हस्तचालित रूप से जोड़े गए हैं और रनटाइम त्रुटि का परिणाम नहीं हैं।


जून 2021 तक, रस्ट (प्रोग्रामिंग लैंग्वेज) के पास अप्राप्य त्रुटियों पर स्टैक ट्रेस के लिए प्रायोगिक समर्थन है। जब थ्रेड पैनिक होता है तो रस्ट [[tderr]] को प्रिंटिंग का समर्थन करता है, लेकिन इसे सेट करके सक्षम किया जाना चाहिए <code>RUST_BACKTRACE</code> [[पर्यावरणपरिवर्ती तारक]]।<ref>{{Cite web|title=std::backtrace - Rust|url=https://doc.rust-lang.org/std/backtrace/index.html|access-date=2021-06-15|website=doc.rust-lang.org}}</ref>
जून 2021 तक, रस्ट (प्रोग्रामिंग लैंग्वेज) के पास अप्राप्य त्रुटियों पर स्टैक ट्रेस के लिए प्रायोगिक समर्थन है। जब थ्रेड पैनिक होता है तो रस्ट [[tderr]] को प्रिंटिंग का समर्थन करता है, लेकिन इसे सेट करके सक्षम किया जाना चाहिए <code>RUST_BACKTRACE</code> [[पर्यावरणपरिवर्ती तारक]]।<ref>{{Cite web|title=std::backtrace - Rust|url=https://doc.rust-lang.org/std/backtrace/index.html|access-date=2021-06-15|website=doc.rust-lang.org}}</ref>
Line 112: Line 104:
* संदर्भ (कंप्यूटिंग)
* संदर्भ (कंप्यूटिंग)
* [[स्टैक ओवरफ़्लो]]
* [[स्टैक ओवरफ़्लो]]
* एक्सेप्शन हेंडलिंग
* अपवाद संचालन
* कॉल स्टैक
* कॉल स्टैक



Revision as of 16:54, 27 February 2023

कम्प्यूटिंग में, स्टैक ट्रेस (जिसे स्टैक बैकट्रेस भी कहा जाता है[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.