【问题标题】:StackOverflowException in .NET 4.NET 4 中的 StackOverflowException
【发布时间】:2011-04-03 11:37:29
【问题描述】:

在我升级到 .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
        }
    }
}

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

【问题讨论】:

  • +1 为 __StackOverflow__Exception :)

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


【解决方案1】:

这似乎是 CLR 中的错​​误 - 您应该向 Microsoft 报告。

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

此异常非常具体地针对这种情况 - 更改任何一项即可解决此问题,例如以下代码可以正常工作:

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

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

【讨论】:

  • 好的,CLR 团队已经收到通知,所以我们应该会在某个时候看到解决此问题的方法
【解决方案2】:

我可以在 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;
        }

非常有趣的问题...

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2016-12-24
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多