बिना किसी अपवाद के .NET में वर्तमान स्टैक ट्रेस कैसे प्रिंट करें?


350

मेरे पास एक नियमित C # कोड है। मेरे पास कोई अपवाद नहीं है । मैं प्रोग्राम डिबगिंग उद्देश्य के लिए वर्तमान स्टैक ट्रेस को प्रोग्रामेटिक रूप से लॉग इन करना चाहता हूं। उदाहरण:

public void executeMethod() 
{
    logStackTrace();
    method();
}

जवाबों:


401

System.Diagnosticsनामस्थान पर एक नजर है । वहाँ उपहार में बहुत सारे!

System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();

यह वास्तव में अच्छा है कि हुड के नीचे क्या हो रहा है जानने के लिए चारों ओर एक प्रहार करें।

मैं आपको सलाह दूंगा कि आप लॉगिंग सॉल्यूशंस (जैसे कि NLog, log4net या Microsoft पैटर्न और प्रैक्टिस एंटरप्राइज लाइब्रेरी) पर एक नज़र डालें, जो आपके उद्देश्यों और कुछ को प्राप्त कर सकते हैं। शुभकामनाएं मेट!


74
ध्यान रखें कि रखें StackTraceहै धीमी गति से कुत्ते - तो विरले ही इसका इस्तेमाल करते हैं।
जोनाथन डिकिंसन

214

इसका एक विकल्प System.Environment.StackTraceSystem.Diagnostics.StackTrace का उपयोग करना है जो स्टैकट्रेस का एक स्ट्रिंग-प्रतिनिधित्व लौटाता है।

एक अन्य उपयोगी विकल्प विजुअल स्टूडियो में चर$CALLER और $CALLSTACK डिबगिंग चर का उपयोग करना है क्योंकि यह अनुप्रयोग के पुनर्निर्माण के बिना रन-टाइम सक्षम किया जा सकता है।


6
Environment.StackTraceबस एक नया उदाहरण है StackTrace
डैनियल

9
@ डैनियल: हां, लेकिन System.Environment.StackTraceउस जानकारी तक पहुंचने का एक अधिक सुविधाजनक तरीका हो सकता है।
लार्सोमा

6
@AndreiRinea: वास्तव में, मैं आप का उपयोग कर लाइन नंबर का उपयोग कर सकते belive System.Diagnostics.StackTrace- देख msdn.microsoft.com/en-us/library/...
larsmoa

5
क्या यह कष्टप्रद नहीं है कि Environment.StackTraceहमेशा साथ शुरू होता है at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()? यह वर्तमान स्टैक ट्रेस का हिस्सा नहीं है क्योंकि इस बिंदु पर किसी की तलाश है।
रॉरी

7
@ रोरी, कंस्ट्रक्टर स्टैकट्रेस (int SkipFrames, bool fNeedFileInfo) पर एक नज़र डालें, आप शुरुआती फ्रेम को छोड़ सकते हैं। ILSpy में विधि को टाइप करें और आप देख सकते हैं कि यह क्या करता है
वाल्टर वेव्सोवेन

39

इसे करने के दो तरीके हैं। System.Diagnostics.StackTrace()आप वर्तमान थ्रेड के लिए एक स्टैक ट्रेस दे देंगे। यदि आपके पास Threadउदाहरण के लिए संदर्भ है , तो आप उस ओवरलोड संस्करण के माध्यम से स्टैक ट्रेस प्राप्त कर सकते हैंStackTrace()

आप स्टैक ओवरफ्लो प्रश्न की जांच करना चाह सकते हैं कि गैर-वर्तमान थ्रेड का स्टैकट्रेस कैसे प्राप्त करें?


16

आप इसे कोड को संशोधित किए बिना विज़ुअल स्टूडियो डीबगर में भी कर सकते हैं।

  1. एक ब्रेकपॉइंट बनाएं जहां आप स्टैक ट्रेस देखना चाहते हैं।
  2. विराम बिंदु पर राइट-क्लिक करें और VS2015 में "एक्शन ..." चुनें। VS2010 में, "जब मारो ..." का चयन करें, फिर "एक संदेश प्रिंट करें" सक्षम करें।
  3. सुनिश्चित करें कि "जारी रखें निष्पादन" चयनित है।
  4. कुछ टेक्स्ट में टाइप करें जिन्हें आप प्रिंट करना चाहते हैं।
  5. जहाँ भी आप स्टैक ट्रेस देखना चाहते हैं, $ CALLSTACK जोड़ें।
  6. प्रोग्राम को डीबगर में चलाएँ।

बेशक, यह मदद नहीं करता है यदि आप एक अलग मशीन पर कोड चला रहे हैं, लेकिन रिलीज कोड को प्रभावित किए बिना या प्रोग्राम को पुनरारंभ करने की आवश्यकता के बिना भी स्टैक ट्रेस को स्वचालित रूप से बाहर निकालने में सक्षम होना काफी आसान हो सकता है।


7
यदि आप एक स्टैक ट्रेस देखना चाहते हैं और आप पहले से ही एक विराम बिंदु पर VS डिबगर में हैं, तो बस डिबग-> विंडोज-> कॉल स्टैक पर जाएं।
खरगौश

5
हां, लेकिन अगर आप इसे इस तरह करते हैं, तो स्टैक ट्रेस देखने के लिए प्रोग्राम को आपके लिए रोकना नहीं है।
हांक शुल्त्

7
Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

आउटपुट के समान होगा:

YourNamespace.Program.executeMethod (स्ट्रिंग संदेश) पर

YourNamespace.Program.Main (स्ट्रिंग [] args) पर

Console.WriteLineअपने Logतरीके से बदलें । वास्तव में, .ToString()Console.WriteLine मामले की कोई आवश्यकता नहीं है क्योंकि यह स्वीकार करता है object। लेकिन आपको अपनी लॉग (स्ट्रिंग संदेश) विधि की आवश्यकता हो सकती है।


-2
   private void ExceptionTest()
    {
        try
        {
            int j = 0;
            int i = 5;
            i = 1 / j;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            var stList = ex.StackTrace.ToString().Split('\\');
            Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
        }
    }

लगता है मेरे लिए काम करता है


3
यह सिर्फ एक स्पष्ट अपवाद उत्पन्न कर रहा है। क्यों? क्यों नहीं स्पष्ट रूप से एक अपवाद को स्पष्ट करने के बजाय, एक दोष के बजाय जो स्वयं में एक अपवाद को बढ़ाएगा? वास्तविक अपवाद को प्राप्त करने के लिए आवश्यक अतिरिक्त कैच लॉजिक का क्या लाभ है? और फिर भी, आप अभी भी वास्तविक पोस्ट किए गए प्रश्न को अनदेखा कर रहे हैं कि किसी भी अपवाद के बिना स्टैक ट्रेस कैसे प्राप्त करें (शीर्षक पढ़ें)।
Flater

यह एक वैध जवाब है, लेकिन एक भगवान भयानक समाधान है। NOO SHOULD USE IT ... @Jeff जहाँ भी आपने ऐसा किया है, इसे सुझाए गए अन्य उत्तरों की तरह एक डिसेंट कोड के साथ बदलें।
तोमर डब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.