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?
По всей видимости, это ошибка среды CLR. Сообщите об этом в Microsoft.
Обратите внимание, что StackOverflowException
возникает когда CLR пытается выполнить Crash
, а не во время выполнения Метод Crash
- программа фактически никогда не заходит в метод. По-видимому, это указывает на некоторый низкоуровневый сбой в среде CLR. (Также обратите внимание, что выброшенное исключение также не имеет трассировки стека).
Это исключение чрезвычайно специфично для данной ситуации — изменение любого из множества моментов исправляет это, например, следующий код работает нормально:
private static void Crash()
{
bool testCrash2 = testCrash;
try { }
finally
{
HttpRuntime.Cache.Insert("xxx", testCrash2);
}
}
Я рекомендую вам сообщить об этом в Microsoft, но попытайтесь обойти проблема, настраивая ваш код в то же время.
Я могу воспроизвести его на машине 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;
}
Очень интересная задача...