代码之家  ›  专栏  ›  技术社区  ›  Sam Saffron James Allen

.NET 4中的StackOverflowException

  •  15
  • Sam Saffron James Allen  · 技术社区  · 14 年前

    在升级到.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 回复  |  直到 14 年前
        1
  •  5
  •   Justin    14 年前

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

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

    这个异常是非常特殊的情况-改变一些事情中的任何一个都可以解决这个问题,例如以下代码可以正常工作:

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

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

        2
  •  3
  •   Jim Killingsworth    14 年前

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

    非常有趣的问题…