Почему этот код не выполняется правильно (видео)?
Я использую Unity (3.4) Monodevelop (2.4.2), и он не выполняет код должным образом, когда я выполняю его в отладчике. Вот ссылка на видео, которое показывает это, пожалуйста, запустите его на 720p и в полноэкранном режиме...
http://www.youtube.com/watch?v=LGN7kxMUqjA
Кроме того, вот несколько скриншотов, показывающих отладчик, отображающий действительно странные значения, когда я наведите курсор мыши на переменную. Вот как это выглядит, когда правильно показывает значение xSectionPixel в первом блоке if... И вот как это выглядит, когда неправильно показывает значение xSectionPixel во втором блоке if...
Это также строка кода, где он начинает выполнять код неправильно.
Что вызвало бы это?
Я попытался переустановить инструменты, используя свежую копию кода из репозитория, я даже установил все это на другом компьютере с другой ОС (Win 7), и он всегда делает то же самое. Разве это не значит, что это должен быть мой код?
Стоит также отметить, что я использую SVN для загрузки / извлечения кода из репозитория, и моя локальная копия находится в моей папке Dropbox.
Большое спасибо заранее за вашу мудрость! Вот также код, если вы можете обнаружить что-то, что может сломать вещи (например, то, как я использую плавающие и целые числа?)
Vector2 textureCoordToHexGridCoord(int textX, int textY)
{
Vector2 hexGridCoord = new Vector2();
float m = hexH / hexR;
int xsection = (int)(textX / (hexH + hexS));
int ysection = (int)(textY / (2 * hexR));
int xSectionPixel = (int)(textX - xsection * (hexH + hexS));
int ySectionPixel = (int)(textY - ysection * (2 * hexR));
//A Section
if(xsection % 2 == 0)
{
hexGridCoord.x = xsection;
hexGridCoord.y = ysection;
if(xSectionPixel < (hexH - ySectionPixel * m))
{
hexGridCoord.x--;
hexGridCoord.y--;
}
if(xSectionPixel < (-hexH + ySectionPixel * m))
{
hexGridCoord.x--;
}
}
//B Section
else
{
if(xSectionPixel >= hexR)
{
if(ySectionPixel < (2 * hexH - xSectionPixel * m))
{
hexGridCoord.x = xsection - 1;
hexGridCoord.y = ysection - 1;
}
else
{
hexGridCoord.x = xsection;
//hexGridCoord.y = ysection;
hexGridCoord.y = ysection - 1;
}
}
if(xSectionPixel < hexR)
{
if(ySectionPixel < (xSectionPixel * m))
{
hexGridCoord.x = xsection;
//hexGridCoord.y = ysection - 1;
hexGridCoord.y = ysection;
}
else
{
hexGridCoord.x = xsection - 1;
hexGridCoord.y = ysection;
}
}
}
return hexGridCoord;
}
6 ответов
У меня нет конкретного опыта работы с фреймворками, которые вы используете, но у меня есть большой опыт работы с отладчиками. Поведение отладчика, которое вы видите, может происходить в одном из двух сценариев (о которых я могу думать...)
Файлы символов и исполняемый код не синхронизируются с вашим исходным кодом, обычно среда IDE должна обнаруживать это, но в некоторых случаях этого не происходит, решение состоит в том, чтобы удалить все двоичные файлы, перекомпилировать и повторить попытку.
Ошибка в отладчике или расширении отладчика (используется для отладки в конкретной среде, в которой вы находитесь, например, unity/monodevelop).
Если вы не можете решить эту проблему, я бы добавил логирование в ваш код и использовал бы его, чтобы действительно понять, что происходит.
Я видел похожее поведение в MonoDevelop с приложениями WinForms, решаемое переустановкой отладчика.
Вы пробовали это или использовали Visual Studio, чтобы убедиться, что проблема в коде?
У вас включены оптимизации? Если да, то делает ли их отключение менее странным?
Включение оптимизации - это одна вещь, о которой я могу подумать, что еще никто не упомянул, что потенциально может вызвать то, что вы видите.
Можете ли вы попытаться удалить свои точки останова, установить новую и пройтись по коду?
Причина, по которой я спрашиваю, состоит в том, что есть способы установить значения с помощью точек останова. Очень похожая вещь произошла со мной и была убеждена, что была ошибка компилятора. После прохождения CLR и ряда других вещей без ответа мы наткнулись на точку останова, которая была ранее установлена для тестирования и никогда не удалялась.
Такое поведение обычно происходит со мной, когда я отлаживаю многопоточную часть приложения.
Что происходит, когда вы отлаживаете несколько потоков одновременно, отладчик в Visual Studio продолжает переключаться между ними, не уведомляя вас по умолчанию.
Теперь, поскольку потоки не выполняют одинаковые строки в одно и то же время, вы получили неожиданные "скачки".
Я считаю, что он широко используется в разработке игр, поэтому в вашем случае у вас есть два варианта:
1) Запустите только один поток, пока выполняете отладку.
2) Проведите юнит-тесты <= Это "лучшая практика".
Вы можете начать с взгляда на NUnit
Первая проблема, скорее всего, связана с точками последовательности в коде JITed. Это точки, где отладчик может остановиться. Они вычисляются средой выполнения на основе IL и символов отладки, сгенерированных компилятором, поэтому это, скорее всего, ошибка среды выполнения или ошибки компилятора. Я не знаю, какая версия среды выполнения и компилятора Mono используется Unity, но вполне возможно, что это было исправлено в более новой версии. Если вы можете воспроизвести это с помощью "обычного" консольного приложения, используя последние официальные версии MonoDevelop и Mono 2.10.x, пожалуйста, отправьте сообщение об ошибке по адресу http://bugzilla.xamarin.com/ с контрольным примером. Если нет, пожалуйста, попросите Unity обновить их версию Mono.
Вторая проблема выглядит как проблема в распознавателе выражений MonoDevelop, которая используется для разрешения символа под мышью. Возможно, это было исправлено в более новой версии MonoDevelop - аналогично, пожалуйста, попробуйте выполнить репродукцию с официальным MonoDevelop 2.8.4 и сообщите об ошибке, если проблема все еще существует.