.NET 4中的StackOverflowException

时间:2010-08-25 00:24:26

标签: c# .net crash runtime stack-overflow

以下代码正常工作,直到我升级到.NET 4(x64)

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

我刚刚发现了运行时错误,还是我的使用存在问题?

2 个答案:

答案 0 :(得分:5)

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

请注意StackOverflowException发生 CLR尝试执行Crash,而不是执行Crash期间方法 - 程序实际上从不进入方法。这似乎表明这是CLR中的一些低级故障。 (另请注意,抛出的异常也没有堆栈跟踪)。

此异常非常特定于这种情况 - 更改任何一项修复此问题,例如以下代码正常工作:

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

我建议您向Microsoft报告,但尝试通过在此期间调整代码来解决此问题。

答案 1 :(得分:3)

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

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

但是,以下代码成功:

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

我认为它可能与finally块中的volatile字段的装箱有关,但后来我尝试了以下(也失败了):

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

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