2010-08-25 30 views
15

Các mã sau hoạt động tốt cho đến khi tôi nâng cấp lên .NET 4 (x64)StackOverflowException trong .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 
     } 
    } 
} 

Ý của tôi chỉ phát hiện ra một lỗi thời gian chạy, hoặc là có một số vấn đề với việc sử dụng của tôi không?

+1

1 cho __ StackOverflow__Exception :) –

Trả lời

5

Điều này có vẻ như là một lỗi trong CLR - bạn nên báo cáo lỗi đó cho Microsoft.

Lưu ý rằng StackOverflowException xảy ra như CLR cố gắng để thực hiện Crash, không trong việc thực hiện các phương pháp Crash - chương trình trên thực tế không bao giờ đi vào phương pháp này. Điều này sẽ xuất hiện để chỉ ra rằng đây là một số lỗi cấp thấp trong CLR. (Cũng lưu ý rằng ngoại lệ được ném cũng không có dấu vết ngăn xếp).

ngoại lệ này là cực kỳ cụ thể để tình trạng này - thay đổi bất kỳ một trong một số điều sửa chữa này, ví dụ đoạn mã sau hoạt động tốt:

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

tôi sẽ khuyên bạn nên báo cáo này cho Microsoft, nhưng cố gắng giải quyết vấn đề bằng cách tinh chỉnh mã của bạn trong thời gian chờ đợi.

+0

Ok, nhóm CLR đã được thông báo vì vậy chúng ta sẽ thấy một sửa chữa cho điều này tại một số điểm –

3

Tôi có thể tạo lại trên máy x86. Các mã sau đây cũng thất bại:

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

Tuy nhiên, đoạn mã sau thành công:

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

tôi nghĩ rằng nó có thể có một cái gì đó để làm với boxing của các lĩnh vực dễ bay hơi trong khối finally, nhưng sau đó tôi đã cố gắng sau đây (mà cũng thất bại):

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

vấn đề rất thú vị ...