Visual Studio C# XNA: Различие между режимами “выпуска” и “отладки”?

Я работаю над демонстрацией об обнаружении коллизий. (Часть кода для этого подробно изложена здесь.) В Режиме отладки это хорошо работает. В режиме Release это быстрее, но обнаружение коллизий ДЕЙСТВИТЕЛЬНО испорчено. Объекты не возвратиться ни от чего или казаться быть странно слегка произведенным силой тяжести. Некоторые объекты взрываются, как будто они столкнулись со специальными взрывчатыми объектами, даже при том, что ни один из тех объектов не существует.

Так..., что Visual Studio изменяет между Выпуском и Режимом отладки, который вызывает эту проблему? (Я использую VS Pro 2008.)

Загадочно, режим Release работал на большое количество разработки. Это просто недавно остановилось.

7
задан Community 23 May 2017 в 11:43
поделиться

3 ответа

Мои экстрасенсорные способности невелики, и трудно сказать, что происходит, не отладив это на самом деле. Но вот предположение. Вопрос, который я обсуждаю здесь:

Почему это вычисление с плавающей запятой дает разные результаты на разных машинах?

относится не только к «кросс-машине», но также и к «отладке и выпуску». Не только возможно, но и вероятно, что окончательная версия вашей программы использует более высокую математическую точность , чем ваша отладочная версия. Если у вас есть ошибки с плавающей запятой, то вполне возможно, что по чистой случайности вы обнаружите ошибки только в версии с более высокой точностью, а не в версии отладки с более низкой точностью.

Почему разница? Потому что в неоптимизированной версии компилятор C # часто генерирует код для временных значений, как если бы они были локальными переменными; затем джиттер фактически выделяет временные локальные переменные в стеке и записывает временные значения из регистров в локальные переменные. Затем, когда они ему нужны, он считывает их обратно в регистры из временных файлов. Этот переход может привести к тому, что значение, которое было в регистре высокой точности, будет усечено до 64-битной точности, что приведет к потере битов точности.

В оптимизированной версии компилятор C # и джиттер усерднее работают над постоянным хранением всего в регистрах, потому что, очевидно, это быстрее и точнее, хотя и труднее отлаживать.

Удачи. Ошибки, которые воспроизводятся только в режиме выпуска, являются настоящей болью.

11
ответ дан 6 December 2019 в 11:48
поделиться

В режиме отладки есть определение на месте (вы можете подтвердить это, проверив "Параметры сборки", щелкнув решение правой кнопкой мыши и выбрав 'Свойства', которые, если они используются, вы можете выполнять вызовы трассировки. В режиме выпуска определение удаляется, и, следовательно, отладочная информация не используется. Если вы должны отладить этот код выпуска, отладчик не сможет определить, какая строка ( исходный код) он был включен, даже если вы указали расположение источника, поскольку код оптимизирован.

Что касается вашей ситуации, возможно, очистив промежуточные файлы сборки в каталоге выпуска или удалив файл .suo, найденный в каталог решений может помочь.

Надеюсь, это поможет, С уважением, Том.

1
ответ дан 6 December 2019 в 11:48
поделиться

Сначала вводятся любые прагмы #if (DEBUG) или #if (RELEASE). У вас может быть код в одном или другом, который должен или не должен вызываться, поэтому ищите их.

Кроме того, по умолчанию сборки Release настроены на «оптимизацию кода», а Debug - нет. Попробуйте изменить этот параметр в конфигурации выпуска (Проект> Свойства> Сборка> «Оптимизировать код») и посмотрите, решит ли это проблему.

5
ответ дан 6 December 2019 в 11:48
поделиться
Другие вопросы по тегам:

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