StackOverflowException в .NET 4 - PullRequest
       16

StackOverflowException в .NET 4

15 голосов
/ 25 августа 2010

Следующий код работает нормально, пока я не обновлю до .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 ]

5 голосов
/ 25 августа 2010

Это может показаться ошибкой в ​​CLR - вы должны сообщить об этом в Microsoft.

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

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

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

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

3 голосов
/ 25 августа 2010

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

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

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

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

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

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

Очень интересная проблема ...

...