2010-08-25 72 views
15

,直到我升级到.NET 4.0(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 :) – 2010-12-30 19:37:49

回答

5

这似乎是CLR中的一个错误 - 您应该将其报告给Microsoft。

注意,StackOverflowException发生的CLR尝试执行Crash,不期间Crash方法的执行 - 事实上程序永远不会进入方法。这似乎表明这是CLR中的一些低级失败。 (还要注意抛出的异常也没有堆栈跟踪)。

这个例外是非常具体的这种情况 - 改变了一些事情中的任何一个修正这一问题,例如下面的代码工作正常:

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

我会建议您将此情况报告给微软,但尝试通过在此期间调整代码来解决此问题。

+0

好的,CLR团队已收到通知,所以我们应该在某个时间点为此解决此问题 – 2010-08-26 03:45:29

3

我可以在x86机器上重现它。下面的代码也将失败:

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

但是,下面的代码成功:

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

我认为这可能是与挥发性领域内的finally块拳击,后来我试着以下(也无法):

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

非常有趣的问题......