Почему этот код не выполняется правильно (видео)?

Я использую 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 ответов

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

  1. Файлы символов и исполняемый код не синхронизируются с вашим исходным кодом, обычно среда IDE должна обнаруживать это, но в некоторых случаях этого не происходит, решение состоит в том, чтобы удалить все двоичные файлы, перекомпилировать и повторить попытку.

  2. Ошибка в отладчике или расширении отладчика (используется для отладки в конкретной среде, в которой вы находитесь, например, 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 и сообщите об ошибке, если проблема все еще существует.

Другие вопросы по тегам