2010-08-25 15 views
15

Le code suivant fonctionne bien jusqu'à ce que je passe à 4 .NET (x64)StackOverflowException dans .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 
     } 
    } 
} 

ai-je UnCover juste un bug d'exécution, ou est-il un problème avec mon utilisation?

+1

+1 pour __ StackOverflow__Exception :) –

Répondre

5

Cela semble être un bug dans le CLR - vous devez le signaler à Microsoft.

Notez que le StackOverflowException se produit comme le CLR tente d'exécuter le Crash, pas pendant l'exécution de la méthode Crash - le programme en fait jamais entre la méthode. Cela semblerait indiquer qu'il s'agit d'une défaillance de bas niveau dans le CLR. (Notez également que l'exception levée n'a pas de trace de pile).

Cette exception est très spécifique à cette situation - Toute modification d'un certain nombre de choses corrige ce problème, par exemple le code suivant fonctionne très bien:

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

Je vous recommande de signaler à Microsoft, mais essayer de contourner le problème en peaufinant votre code en attendant.

+0

Ok, l'équipe CLR a été notifiée donc nous devrions voir un correctif pour cela à un moment donné –

3

Je peux le reproduire sur une machine x86. Le code suivant échoue aussi:

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

Cependant, le code suivant réussit:

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

Je pensais que cela pourrait avoir quelque chose à voir avec la boxe des champs volatils dans le bloc finally, mais j'essayé ce qui suit (qui échoue également):

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

problème très intéressant ...