2013-04-11 3 views
5

स्टैक ट्रेस मैं ASP.NET अनुप्रयोग, एक ArgumentNullException से उत्पन्न से वापस पाने के लिए, धारणा है कि एक त्रुटि नीचे कोड की अंतिम पंक्ति पर होता है देता है। जहां तक ​​मैं देख सकता हूँ, कि असंभव है, लेकिन अगर JIT Bar करने के लिए कॉल, जो एक अलग स्टैक ट्रेस में परिणाम होगा बाहर अनुकूलित किया है, यह सब समझा जाएगा। मुझे यकीन है कि यह सी # कंपाइलर नहीं है, क्योंकि सीआईएल दिखता है जैसे मैं उम्मीद करता हूं। क्या यह संभव है कि जेआईटी कंपाइलर ने बार को कॉल हटा दिया हो?क्या .NET JIT कंपाइलर एक विधि कॉल ऑप्टिमाइज़ करेगा?

ग # 4, .नेट 4.0.30319.1, ASP.NET 4.0.30319.1

संपादित करें: मैं इस एक रिलीज विन्यास है, अनुकूलन कोड के साथ उल्लेख किया जाना चाहिए था = पर, केवल pdb-डीबग जानकारी = ।

Stack Trace: 

[ArgumentNullException: Value cannot be null. Parameter name: value] 
CreateHiddenField(HtmlTextWriter tr, String name, String value) in Foo.cs:129 
Foo(IHttpContext context, HtmlTextWriter writer) in Foo.cs:106 

private static void Foo(IHttpContext context, HtmlTextWriter writer) 
{ // line 103 
    Bar(writer, AuthorizationServerResponseDetailsHttpRequestParser.RequestSAMLFieldName, context); 
    Bar(writer, AuthorizationServerResponseDetailsHttpRequestParser.RequestTargetFieldName, context); 
    // line 106 - blank line in source code. 
    CreateHiddenField(tr, name, string.Empty); // looks like its here 
} 

private static void Bar(HtmlTextWriter tr,string name, IHttpContext context) 
{ // line 116 
    #region Sanitation 
    if (tr == null) { throw new System.ArgumentNullException("tr"); } 
    if (name == null) { throw new System.ArgumentNullException("name"); } 
    if (context == null) { throw new System.ArgumentNullException("context"); } 
    #endregion 

    CreateHiddenField(tr, name, context.RequestQueryString(name)); 
} 

private static void CreateHiddenField(HtmlTextWriter tr, string name, string value) 
{ // line 127 
    #region Sanitation 
    if (tr == null) { throw new System.ArgumentNullException("tr"); } 
    if (name == null) { throw new System.ArgumentNullException("name"); } 
    if (value == null) { throw new System.ArgumentNullException("value"); } 
    #endregion 

    // payload... 
} 
+1

आप स्टैक ट्रेस दे सकते हैं? जेआईटी एक विधि को रेखांकित कर सकता है अगर यह आवश्यकताओं को फिट करता है - जो इसे स्टैक ट्रेस से 'गायब' कर सकता है ... मुझे लगता है। पहले कोड ब्लॉक में – Joshua

+0

इसके वहां है। मैंने इसे पढ़ने योग्य बनाने के लिए नामस्थान/फ़ाइल नाम हटा दिए। – jasper

+1

आप क्या जानते हैं, मुझे नहीं लगता था कि यह एक छोटा सा निशान था क्योंकि यह बहुत छोटा था। मेरा अनुमान है कि यह रेखांकित किया गया था, लेकिन मुझे नहीं पता कि संकलक 'उचित' स्टैक ट्रेस रखने के लिए कोड को उत्सर्जित करता है या नहीं। क्या स्टैक ट्रेस किसी भी लाइन नंबर या बाइट ऑफ़सेट के साथ आता है? – Joshua

उत्तर

4

http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx के अनुसार, घबराना एक विधि कॉल inlines हैं, तो यह वास्तव में स्टैक ट्रेस में ध्वस्त हो गई हो जाएगा। आप इसे इनलाइन करने के लिए नहीं करना चाहते हैं (जो शायद एक अच्छा विचार नहीं है), तो आप विधि पर

[MethodImpl(MethodImplOptions.NoInlining)] 

उपयोग कर सकते हैं। एक exe के लिए, आप ट्रैकिंग जानकारी (लिंक किए गए पृष्ठ के नीचे) उत्पन्न करने के लिए JITTER को बताने के लिए एक आईएनआई फ़ाइल का भी उपयोग कर सकते हैं, लेकिन मुझे यकीन नहीं है कि यह एएसपी.NET ऐप के लिए कैसे काम करेगा।

+0

वही है जो मैं ढूंढ रहा था, लेकिन मुझे यह नहीं मिला। – Joshua

+0

सही। यूआरएल पुष्टि करता है कि मुझे क्या संदेह था, लेकिन जब मैंने खोज की थी तो मुझे उस लेख की तरह कुछ भी नहीं मिला। – jasper

2

मैं कभी नहीं देखा है JIT एक विधि कॉल निकालने के लिए, बस इसे इनलाइन। अक्सर, यह अप्रयुक्त स्थानीय चर निकाल देंगे, लेकिन मैं काफी हद तक निश्चित JIT staticly एक विधि कॉल करने से दुष्प्रभाव के सभी का विश्लेषण नहीं कर सकता हूँ, इसलिए मुझे नहीं लगता कि यह कभी भी एक विधि कॉल निकाल देंगे है।

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

आप स्टैक ट्रेस का एक बेहतर विचार प्राप्त करने के लिए अनुकूलन निष्क्रिय कर सकते हैं। MSDN has some instructions here

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

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