2008-09-09 4 views
50

से स्टैक ट्रेस जानकारी प्रिंट करें हमारे उत्पाद में कुछ त्रुटि प्रबंधन के हिस्से के रूप में, हम कुछ स्टैक ट्रेस जानकारी को डंप करना चाहते हैं। हालांकि, हम अनुभव करते हैं कि कई उपयोगकर्ता प्रोग्राम से उपलब्ध पूरी रिपोर्ट की एक प्रति हमें भेजने के बजाय त्रुटि संदेश संवाद का एक स्क्रीनशॉट लेंगे, और इस प्रकार मैं इस संवाद में कुछ न्यूनतम स्टैक ट्रेस जानकारी उपलब्ध करना चाहता हूं।सी #

मेरी मशीन पर

एक नेट स्टैक ट्रेस इस तरह दिखता है:

at <class/method> [in file:line ##] 

हालांकि, :

प्रारूप इस होना करने के लिए लग रहा है:

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) 
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) 
at System.IO.StreamReader..ctor(String path) 
at LVKWinFormsSandbox.MainForm.button1_Click(Object sender, EventArgs e) in C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36 

मैं इस सवाल है और कीवर्ड में, मुझे लगता है कि यदि वे चलाते हैं, तो एक नेटवर्क .NET रनटाइम मैं स्थानीयकृत कर दूंगा। मैंने स्थापित अंग्रेजी के nstead।

क्या इस भाषा में तटस्थ तरीके से इस स्टैक ट्रेस को अलग करने का कोई तरीका है, ताकि मैं उन प्रविष्टियों के लिए केवल फ़ाइल और लाइन नंबर प्रदर्शित कर सकूं?

दूसरे शब्दों में, मैं ऊपर पाठ से इस जानकारी को चाहते हैं:

C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36 

किसी भी सलाह आप दे सकते हैं उपयोगी होगा।

+1

काश कोई इस के लिए पार्स जवाब दिया होता, जैसा कि मैंने मनमाना अनुप्रयोगों से लॉग इन तार के साथ काम कर रहा हूँ और (लिंडहोम उत्तर के आधार पर) वास्तव में इस पर कुछ विवरण प्राप्त करने की उम्मीद कर रहा था।यह देखते हुए कि आपने स्टैकट्रेस के स्रोत पर नियंत्रण रखा है, आपने वास्तव में सही उत्तर चुना है :) – TheXenocide

उत्तर

70

आप

var trace = new System.Diagnostics.StackTrace(exception); 

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

यह भी देखें: StackTrace reference

+0

ओह, अच्छा, मुझे यह नहीं पता था! मैं निश्चित रूप से इसमें देख लूंगा। –

+0

रिलीज मोड में आप अभी भी एक अपवाद के स्टैक ट्रेस प्राप्त करने में सक्षम हैं? – erdogany

+0

मैं फ़ाइल में ** अपवाद ** serialize। 'SerializationHelper.Serialize (@" c: \ temp \ ConfigurationErrorsExceptions.ser ", ex); 'अगर मैं फ़ाइल से varerialize' var अपवाद = SerializationHelper.Deserialize (@" ConfigurationErrorsExceptions.ser ");' *** ट्रेस *** _not available_ 'var trace = new system.Diagnostics.StackTrace (अपवाद के रूप में अपवाद);' ** फ्रेमकाउंट ** 0 – Kiquenet

0

विकल्प, log4net के रूप में, हालांकि संभावित खतरनाक, System.Diagnostics से मुझे बेहतर परिणाम दे दी है। मूल रूप से log4net में, आपके पास विभिन्न लॉग स्तरों के लिए एक विधि है, प्रत्येक अपवाद पैरामीटर के साथ। इसलिए, जब आप दूसरा अपवाद पास करते हैं, तो यह आपके द्वारा कॉन्फ़िगर किए गए एपेंडर को स्टैक ट्रेस प्रिंट करेगा।

उदाहरण: Logger.Error("Danger!!!", myException);

उत्पादन, कॉन्फ़िगरेशन के आधार पर, लगता है

System.ApplicationException: Something went wrong. 
    at Adapter.WriteToFile(OleDbCommand cmd) in C:\Adapter.vb:line 35 
    at Adapter.GetDistributionDocument(Int32 id) in C:\Adapter.vb:line 181 
    ... 
+0

क्या आप स्पष्टीकरण दे सकते हैं कि log4net "संभावित रूप से खतरनाक" होने के बारे में आपका क्या मतलब है? –

+0

मुझे यकीन नहीं है कि ओग्लेस्टर का क्या मतलब था, लेकिन मुझे पता है कि stackoverflow.com में कुछ डेडलॉक समस्याएं थीं क्योंकि log4net डेटाबेस में अपवाद लॉगिंग कर रहा था। मुझे व्यक्तिगत रूप से कोई समस्या नहीं है, लेकिन मैं इसे सरल रखता हूं और पाठ फ़ाइलों को रोल करने के लिए चिपक जाता हूं। –

+0

यदि आप अपने संदर्भों को सही तरीके से प्रबंधित नहीं करते हैं, तो आप मेमोरी रिसाव के साथ समाप्त हो जाएंगे। थोड़ी देर बाद मैंने जिस वेबसाइट पर काम किया वह लॉग 4नेट का व्यापक रूप से उपयोग करता है (रोलिंग फाइलें)। चूंकि log4net फ़ाइल फ़ाइल (असुरक्षित) संदर्भित करता है, तो आपको लॉग 4नेट संदर्भों को साफ या एक न्यूनतम तक रखना सुनिश्चित करना होगा। –

27

यहाँ कुछ कोड मैं बस बनाने के लिए एक अपवाद

public static void LogStack() 
{ 
    var trace = new System.Diagnostics.StackTrace(); 
    foreach (var frame in trace.GetFrames()) 
    { 
    var method = frame.GetMethod(); 
    if (method.Name.Equals("LogStack")) continue; 
    Log.Debug(string.Format("{0}::{1}", 
     method.ReflectedType != null ? method.ReflectedType.Name : string.Empty, 
     method.Name)); 
    } 
} 
+0

आपको लगता है कि यह कहीं भी कार्यक्षमता में बनाया जाएगा क्योंकि अपवाद हैंडलर इसे मूल रूप से करता है। –

18

बिना यह करने के लिए इस्तेमाल करते हैं यह एक 15 सेकंड कॉपी-पेस्ट उत्तर:

static public string StackTraceToString() 
{ 
    StringBuilder sb = new StringBuilder(256); 
    var frames = new System.Diagnostics.StackTrace().GetFrames(); 
    for (int i = 1; i < frames.Length; i++) /* Ignore current StackTraceToString method...*/ 
    { 
     var currFrame = frames[i]; 
     var method = currFrame.GetMethod(); 
     sb.AppendLine(string.Format("{0}:{1}",      
      method.ReflectedType != null ? method.ReflectedType.Name : string.Empty, 
      method.Name)); 
    } 
    return sb.ToString(); 
} 

+3

इसके लिए धन्यवाद। ध्यान दें कि आप पंक्ति चरित्र के विशिष्ट अंत हार्डकोडिंग से बचने के लिए sb.AppendLine (...) का उपयोग कर सकते हैं। –

+0

सच। अद्यतन ... –

8

या कोई भी छोटा संस्करण है ..

Console.Write(exception.StackTrace);