2009-02-10 18 views
246

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

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

उत्तर

279

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

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

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

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

+45

ध्यान रखें कि 'स्टैकट्रेस' ** कुत्ता धीमा ** है - इसलिए इसे कम से कम उपयोग करें। –

36

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

आप स्टैक ओवरफ़्लो प्रश्न How to get non-current thread's stacktrace? को भी देखना चाह सकते हैं।

163

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

एक और उपयोगी विकल्प $CALLER और $CALLSTACKdebugging variables in Visual Studio का उपयोग करना है क्योंकि इसे एप्लिकेशन के पुनर्निर्माण के बिना रन-टाइम सक्षम किया जा सकता है।

+3

'पर्यावरण। स्टैकट्रेस 'बस' स्टैकट्रेस 'का एक उदाहरण है। – Daniel

+5

@ Daniel: हाँ, लेकिन 'System.Environment.StackTrace' उस जानकारी तक पहुंचने का एक और सुविधाजनक तरीका हो सकता है। – larsmoa

+1

सच है। लेकिन अगर आपको फ्रेम छोड़ने या फ़ाइल जानकारी छोड़ने की आवश्यकता है तो आपको सीधे 'स्टैकट्रेस' का उपयोग करना होगा। – Daniel

10

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

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

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

+0

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

+3

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

संबंधित मुद्दे