2010-08-25 2 views
15

Следующий код работает отлично, пока я не обновиться до .NET 4 (x64)StackOverflowException в .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 
     } 
    } 
} 

ли я просто раскрыть во время выполнения ошибки, или есть какой-то вопрос с моим использованием?

+1

+1 за __ StackOverflow__Exception :) –

ответ

5

Это может показаться ошибкой в ​​CLR - вы должны сообщить об этом Microsoft.

Обратите внимание, что StackOverflowException происходит , как СЬК пытается выполнить команду Crash, не во выполнение метода Crash - программа фактически никогда не входит в метод. Это, по-видимому, указывает на то, что это небольшой сбой низкого уровня в CLR. (Также обратите внимание, что в заброшенном исключении также нет трассировки стека).

Это исключение невероятно специфичный для данной ситуации - изменение любого из целого ряда вещей фиксирует это, например, следующий код работает отлично:

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

Я рекомендовал бы сообщить об этом в Microsoft, но попытайтесь обойти проблему, настроив ваш код тем временем.

+0

Хорошо, команда CLR была уведомлена, поэтому мы должны увидеть исправление для этого в какой-то момент –

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; 
     } 

Очень интересная проблема ...