2010-08-25 73 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; 
     } 

非常有趣的問題......