2013-03-12 7 views
6

मैं अपने ASP.NET वेब अनुप्रयोग में निम्न विधि का उपयोग एक अपवाद के लिए स्टैक ट्रेस प्राप्त करने के लिए उम्मीद की जानकारी नहीं लौटते:StackTrace/StackFrame उत्पादन परिवेश

public static void getStackTraceInfo(System.Diagnostics.StackTrace trace) 
{ 
    for (int i = 0; i < trace.FrameCount; i++) 
    { 
     int nLine = trace.GetFrame(i).GetFileLineNumber(); 
     int nCol = trace.GetFrame(i).GetFileColumnNumber(); 
     string methodName = trace.GetFrame(i).GetMethod().Name; 
    } 
} 

try 
{ 
} 
catch(Exception ex) 
{ 
    getStackTraceInfo(new System.Diagnostics.StackTrace(ex, true)); 
} 

यह मुझे पूरी लाइन देता है/कॉलम/विधि नाम की जानकारी अगर मैं इसे विजुअल स्टूडियो 2010 देव पर्यावरण में चलाता हूं, लेकिन आईआईएस पर उत्पादन वातावरण में यह सभी 0 और विधि नाम खाली स्ट्रिंग के रूप में देता है।

क्या मुझे आईआईएस पर भी काम करने के लिए कुछ खास करने की ज़रूरत है?

+0

मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

+1

यह सही है। जब तक एप्लिकेशन डीबग मोड में संकलित नहीं होता है और प्रासंगिक .pdb फ़ाइलों को उत्पादन में बिन निर्देशिका में रखा जाता है, तब तक आपको पूर्ण डीबग जानकारी (लाइन नंबर सहित) के साथ एक स्टैक ट्रेस नहीं मिल रहा है। एक अनुशंसित अभ्यास नहीं है। –

+0

यदि आपका कोड "रिलीज" मोड में "बिल्ड" में है, तो मुझे लगता है कि आपको लाइन नंबर नहीं मिलेगा। – dekdev

उत्तर

29

अगर मैं इसे विजुअल स्टूडियो 2010 देव पर्यावरण में चलाता हूं, तो मुझे पूर्ण लाइन/कॉलम/विधि नाम जानकारी देता है, लेकिन आईआईएस पर उत्पादन वातावरण में यह सभी 0 और विधि का नाम रिक्त स्ट्रिंग के रूप में देता है।

सही। प्रकार का नाम ध्यान से पढ़ें; कि Diagnostics महत्वपूर्ण है। उस नामस्थान के प्रकार डिबग वातावरण में समस्याओं का निदान करने के लिए डिज़ाइन किए गए थे।

क्या मुझे आईआईएस पर भी काम करने के लिए कुछ खास करने की ज़रूरत है?

नहीं; आपको डायग्नोस्टिक उपकरण उत्पादन में उपयोग करने की आवश्यकता नहीं है।

यदि किसी कारण से आप उत्पादन वातावरण में नैदानिक ​​उपकरण का उपयोग करना चाहते हैं, तो कम से कम आपको पीडीबी फाइलों को उत्पादन वातावरण में धक्का देना होगा। यह एक खतरनाक और मूर्ख काम हो सकता है, जैसा कि हम नीचे देखेंगे। मैं अनुशंसा करता हूं कि आप ऐसा न करें।

कुछ सवाल आप से पूछना नहीं किया:

क्या उपकरण मैं एक उत्पादन वातावरण में फोन करने वाले के बारे में जानकारी प्राप्त करने के लिए उपयोग करना चाहिए?

आप लाइन नंबर, आदि, एक विधि कॉल की पाने के लिए की जरूरत है, उपकरण आप शायद का उपयोग करना चाहिए नई CallerLineNumber है और संबंधित सी # 5.0 में जिम्मेदार बताते हैं। यहाँ उन पर एक अच्छा ब्लॉग है:

http://blog.slaks.net/2011/10/subtleties-of-c-5s-new-callerlinenumber.html

आप एक अपवाद के स्टैक ट्रेस के बारे में जानकारी प्राप्त करने के लिए की जरूरत है, जो आप देखते हैं क्या मिलेगा है।

एक डिबग वातावरण में StackTrace वस्तु एक गारंटी प्रदान करते हैं कि स्टैक ट्रेस मुझे बताता है जहां वर्तमान कॉल से आया है?

नहीं। एक स्टैक ट्रेस आपको यह नहीं बताता कि आप कहां से आए थे। एक स्टैक ट्रेस आपको बताता है जहां आप अगले जा रहे हैं। यह उपयोगी है क्योंकि आप कहां से आए थे और आप कहां जा रहे हैं, के बीच अक्सर एक मजबूत सहसंबंध होता है; आम तौर पर आप वापस जा रहे हैं जहां से आप आए थे।

हालांकि यह हमेशा सत्य नहीं है। सीएलआर कभी-कभी यह पता लगाए बिना कहां जा सकता है कि आप कहां से आए थे, इस मामले में स्टैक ट्रेस में आपकी आवश्यक जानकारी नहीं है।

उदाहरण के लिए, पूंछ कॉल अनुकूलन ढेर से फ्रेम हटा सकते हैं। इनलाइनिंग ऑप्टिमाइज़ेशन कॉलिंग विधि के हिस्से की तरह एक विधि को कॉल कर सकता है। सी # 5 में असीमित वर्कफ़्लो पूरी तरह से तलाक "आप कहाँ से आए" और "आप कहां जा रहे हैं"; एक await के बाद फिर से शुरू होने वाली एसिंक्रोनस विधि का स्टैक ट्रेस आपको बताता है कि आप अगले await के बाद कहां जा रहे हैं, यह नहीं कि आप पहले await से पहले विधि में कैसे पहुंचे।

स्टैक निशान अविश्वसनीय हैं, इसलिए उन पर भरोसा न करें। उन्हें केवल नैदानिक ​​सहायता के रूप में उपयोग करें।

एएसपी में नैदानिक ​​जानकारी का खुलासा करना विशेष रूप से खतरनाक क्यों है?

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

एएसपी सर्वरों को उत्पादन वातावरण में जितनी संभव हो उतनी छोटी नैदानिक ​​जानकारी के रूप में पेश करना चाहिए। उस उत्पादन माहौल में आपके पास कम डीबग जानकारी है, कम गलती करने की संभावना कम है और हमलावर को आपके कार्यान्वयन के विवरण का पर्दाफाश करना है।

+0

अच्छा बिंदु, इस टिप्पणी को छोड़कर 'स्टैक ट्रेस आपको यह नहीं बताता कि आप कहां से आए थे।' यह आपको बिल्कुल बताता है। सच है, कुछ प्रक्रियाएं इसे संशोधित कर सकती हैं, लेकिन मिल कोड के आपके भाग के लिए यह बहुत असामान्य है। आम जनता के लिए इस सभी डीबगर जानकारी को उजागर करने के खतरों के लिए - मैं पूरी तरह से सहमत हूं। यह सारी जानकारी एक आंतरिक लॉग में जाती है जो प्रकट नहीं होती है। – ahmd0

+17

@ ahmd0: जब मैं लोगों को स्टैक निशान के बारे में सच्चाई बताता हूं तो यह आश्चर्यजनक आश्चर्य होता है। स्टैक ट्रेस में * वापसी पता * होता है, जिसे * कॉलर * का पता नहीं होना चाहिए। अधिकांश समय यह है, लेकिन यह होना आवश्यक नहीं है और ऐसी स्थितियां हैं जिनमें यह नहीं है।याद रखें, ढेर का उद्देश्य * निरंतरता का संशोधन * है, और निरंतरता * भविष्य * के बारे में परिभाषा जानकारी नहीं है, न कि * अतीत *। यदि आप कभी-कभी निरंतरता से अतीत के बारे में जानकारी को कम कर सकते हैं, लेकिन यह उसका * उद्देश्य * नहीं है, इसलिए आप इस पर भरोसा नहीं कर सकते हैं। –

+2

निश्चित रूप से कोई आवश्यकता नहीं है कि निरंतरता को एक ढेर द्वारा संशोधित किया जाए। जैसा कि मैंने उपर्युक्त उल्लेख किया है, एक असीमित कार्य की निरंतरता एक प्रतिनिधि और संदर्भ के संयोजन द्वारा संशोधित की जाती है; इसमें कोई ढेर शामिल नहीं है, और इसलिए किसी कार्य को जारी रखने के बारे में आपको कुछ भी बताता है कि यह कार्य कैसे शुरू हुआ था। –

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