StackOverflowException in .NET 4

The following code works fine until I upgrade to .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
        }
    }
}

Did I just uncover a runtime bug, or is there some issue with my usage?

15
задан Sam Saffron 25 August 2010 в 00:24
поделиться

2 ответа

По всей видимости, это ошибка среды CLR. Сообщите об этом в Microsoft.

Обратите внимание, что StackOverflowException возникает когда CLR пытается выполнить Crash, а не во время выполнения Метод Crash - программа фактически никогда не заходит в метод. По-видимому, это указывает на некоторый низкоуровневый сбой в среде CLR. (Также обратите внимание, что выброшенное исключение также не имеет трассировки стека).

Это исключение чрезвычайно специфично для данной ситуации — изменение любого из множества моментов исправляет это, например, следующий код работает нормально:

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

Я рекомендую вам сообщить об этом в Microsoft, но попытайтесь обойти проблема, настраивая ваш код в то же время.

5
ответ дан 1 December 2019 в 05:06
поделиться

Я могу воспроизвести его на машине x86. Следующий код также дает сбой:

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

Однако следующий код выполняется успешно:

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

Я подумал, что это может быть связано с упаковкой volatile полей в блок finally, но затем я попробовал следующее (что также не помогло):

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

Очень интересная задача...

3
ответ дан 1 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: