общий список типов значений с последовательным расположением и размером пакета -> BUG? - PullRequest
6 голосов
/ 04 августа 2010

Следующий код генерирует исключение ExecutionEngineException при запуске исполняемого файла сборки release (start exe file ).Это ошибка или это нормальное поведение?

тип значения с размером пакета = 1:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct RunLong
{
    public byte Count;
    public long Value;

    public RunLong(byte count, long value)
    {
        Count = count;
        Value = value;
    }
}

Использование структуры в общем списке (T), добавление значений и получение или установкаего свойство value делает сбой исполняемого файла, если он был построен в режиме выпуска.Сбой не происходит, когда исполняемый файл создается в режиме отладки или при запуске кода в отладчике Visual Studio (режим выпуска или отладки).

List<RunLong> runs = new List<RunLong>(1024);

for (int i = 0; i < 1000; i++)
{
    runs.Add(new RunLong(1, i));
}

RunLong last = runs[runs.Count - 1];

last.Count = (byte)(last.Count + 1);

 runs[runs.Count - 1] = last;

Может кто-нибудь подтвердить это?Есть ли разумное объяснение?

Я использую VS 2010, .net 4, Win XP SP3

Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 19 апреля 2011

Эта проблема была исправлена ​​в MS11-028 на прошлой неделе.Подробности смотрите в моем блоге .

2 голосов
/ 04 августа 2010

Это появляется на поверхности как ошибка в движке x86 JIT.Это только репродукции при следующих обстоятельствах

  • Компиляция в розничной торговле
  • Компиляция для x86
  • Запуск без отладчика Visual Studio (хотя копии под WinDbg)

Он не воспроизводится в режиме amd64, что заставляет меня подозревать, что это либо

  1. Проблема выравнивания (также известная как ошибка в вашем коде)
  2. Проблема JIT x86

Я ни в коем случае не специалист по выравниванию, но я верю, что ваш код верен.Пожалуйста, отправьте сообщение об ошибке при подключении, чтобы убедиться, что проблема исследована, и добавьте ссылку на ошибку в раздел комментариев моего ответа (я хотел бы отследить ее внутри).

...