2010-08-25 12 views
15

निम्नलिखित कोड ठीक काम करता है जब तक मैं नेट 4 (64)StackOverflowException 4

namespace CrashME 
{ 
    class Program 
    { 
     private static volatile bool testCrash = false; 
     private static void Crash() 
     { 
      try 
      { 
      } 
      finally 
      { 
       HttpRuntime.Cache.Insert("xxx", testCrash); 
      } 

     } 

     static void Main(string[] args) 
     { 
      Crash(); 
      // Works on .NET 3.5 , crash on .NET 4 
     } 
    } 
} 

में नवीनीकृत मैं सिर्फ एक क्रम बग को उजागर किया था, या मेरे उपयोग के साथ कुछ मुद्दा है?

+1

के लिए +1 __ StackOverflow__Exception :) –

उत्तर

5

यह सीएलआर में एक बग प्रतीत होता है - आपको इसे माइक्रोसॉफ्ट को रिपोर्ट करना चाहिए।

नोट StackOverflowException होता है कि के रूप में CLR Crash, नहीं दौरान Crash विधि के निष्पादन को निष्पादित करने का प्रयास करता है - वास्तव में कार्यक्रम विधि में प्रवेश करती है कभी नहीं। यह इंगित करेगा कि यह सीएलआर में कुछ निम्न स्तर की विफलता है। (यह भी ध्यान रखें कि फेंकने वाले अपवाद में कोई स्टैक ट्रेस नहीं है)।

यह अपवाद अविश्वसनीय रूप से इस स्थिति के लिए विशिष्ट है - चीजों के एक नंबर से किसी एक को बदलने पर यह समस्या नहीं, उदाहरण के लिए निम्नलिखित कोड ठीक काम करता है:

private static void Crash() 
{ 
    bool testCrash2 = testCrash; 
    try { } 
    finally 
    { 
     HttpRuntime.Cache.Insert("xxx", testCrash2); 
    } 
} 

मुझे लगता है कि आप Microsoft से उसकी रिपोर्ट की सिफारिश करेंगे, लेकिन इस दौरान अपने कोड को ट्वीव करके इस मुद्दे के आसपास काम करने का प्रयास करें।

+0

ठीक है, सीएलआर टीम को अधिसूचित किया गया है, इसलिए हमें किसी बिंदु पर इसके लिए एक फिक्स देखना चाहिए –

3

मैं इसे x86 मशीन पर पुन: पेश कर सकता हूं। निम्नलिखित कोड भी विफल रहता है:

 try 
     { 
     } 
     finally 
     { 
      var foo = new List<object>(); 
      foo.Add(testCrash); 
     } 

हालांकि, निम्नलिखित कोड सफल होता है:

 try 
     { 
     } 
     finally 
     { 
      var foo = new List<bool>(); 
      foo.Add(testCrash); 
     } 

मैंने सोचा कि यह अंत में ब्लॉक के भीतर अस्थिर क्षेत्रों में बॉक्सिंग के साथ कुछ हो सकता है, लेकिन फिर मैं करने की कोशिश की निम्नलिखित (जो भी विफल रहता है):

 try 
     { 
     } 
     finally 
     { 
      bool[] foo = new bool[1]; 
      foo[0] = testCrash; 
     } 

बहुत दिलचस्प समस्या ...

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