2010-08-25 20 views
15

El siguiente código funciona bien hasta migrar a .NET 4 (x64)StackOverflowException en .NET 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 
     } 
    } 
} 

¿Acabo de descubrir un error de tiempo de ejecución, o hay algún problema con el uso de mi?

+1

1 de __ StackOverflow__Exception :) –

Respuesta

5

Esto parece ser un error en el CLR; debe informarlo a Microsoft.

Tenga en cuenta que la StackOverflowException ocurre como el CLR intenta ejecutar el Crash, no durante la ejecución del método Crash - el programa, de hecho, nunca entra en el método. Esto parece indicar que se trata de una falla de bajo nivel en el CLR. (También tenga en cuenta que la excepción arrojada tampoco tiene rastro de pila).

Esta excepción es muy específica a esta situación - el cambio de cualquiera de una serie de cosas corrige esto, por ejemplo, el siguiente código funciona bien:

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

recomendaría que informar de esto a Microsoft, pero intentar solucionar el problema modificando el código mientras tanto.

+0

Ok, el equipo de CLR ha sido notificado, así que deberíamos ver una solución para esto en algún momento –

3

Puedo reproducirlo en una máquina x86. El siguiente código también falla:

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

Sin embargo, el siguiente código tiene éxito:

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

pensé que podría tener algo que ver con el boxeo de campos volátiles dentro del bloque finally, pero luego tratado la siguiente (que también falla):

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

problema muy interesante ...