2010-08-25 13 views
15

Il seguente codice funziona bene fino a quando aggiorno a .NET 4 (x64)StackOverflowException in .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 
     } 
    } 
} 

Ho appena scoprire un bug runtime, o c'è qualche problema con il mio utilizzo?

+1

+1 per __ StackOverflow__Exception :) –

risposta

5

Questo sembra essere un bug nel CLR: è necessario segnalarlo a Microsoft.

noti che il StackOverflowException verifica come il CLR tenta di eseguire il Crash, non durante l'esecuzione del metodo Crash - il programma infatti non entra mai il metodo. Ciò sembrerebbe indicare che si tratta di un errore di basso livello nel CLR. (Si noti inoltre che l'eccezione generata non ha traccia di stack).

Questa eccezione è incredibilmente specifico per questa situazione - cambiare uno qualsiasi di un certo numero di cose risolve questo, ad esempio, il seguente codice funziona bene:

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

io vi consiglio di segnalare l'accaduto a Microsoft, ma provare a risolvere il problema modificando il codice nel frattempo.

+0

Ok, il team CLR è stato avvisato quindi dovremmo vedere una soluzione per questo a un certo punto –

3

Posso riprodurlo su una macchina x86. Il seguente codice fallisce anche:

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

Tuttavia, il seguente codice riesce:

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

ho pensato che potrebbe avere qualcosa a che fare con la boxe dei campi volatili all'interno del blocco finally, ma poi ho provato la seguente (che fallisce anche):

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

problema molto interessante ...

Problemi correlati