Повторная пошаговая отладка ≠ запустить отладку - PullRequest
2 голосов
/ 24 ноября 2011

Я использую C # с XNA в Visual Studio 2010 Ultimate.

У меня есть программа, которая выполняет некоторые вычисления, не связанные с синхронизацией, потоками или чем-то еще, что может повлиять на результат, если я остановлю выполнение для отладки, но затем ничего не сделаю, прежде чем продолжить выполнение остальной программы.

В конце программа выводит некоторые данные на экран.

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

steps

Показывает прогон с отдельными F10 шагами.

Программа многократно запускает простую игру для двух игроков, игра включает перемещение счетчика на доске, оба игрока автоматизированы и передвигаются случайным образом. 100 игр происходят на каждой линии, некоторые игры не заканчиваются до истечения определенного количества ходов и не учитываются. Как видно из этих 8 наборов случайных игр, он достаточно хорошо сбалансирован, по крайней мере, для игроков, которые делают случайные ходы в отношении того, кто победит, а кто проиграет.

На следующем рисунке показан прогон с F5.

run

Что-то здесь не так, игры не влияют друг на друга, а сеты - это просто место, где можно остановиться и начать считать, они ничего не влияют. Однако в отличие от первого изображения мы выиграли все 100 игр подряд, дважды, но затем проиграли 100 совершенно новых, не связанных друг с другом игр подряд 2 сета.

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

Что может быть не так?

Ответы [ 2 ]

6 голосов
/ 24 ноября 2011

Если это не потоки, то я подозреваю, что что-то, вероятно, использует класс System.Random. Обязательно используйте один и тот же экземпляр класса Random для каждого вызова Next().

Вероятная проблема состоит в том, что, если вы вызываете метод, используя Random в быстрой последовательности (т. Е. При нормальной работе, а не в отладчике), и каждый раз создаете новый экземпляр, вы, скорее всего, заполняете случайный экземпляр с тем же начальным числом, поскольку он основан на системных часах. «Замедление» посредством отладки предотвратит это, поэтому поведение будет лучше во время пошагового сеанса отладки.

3 голосов
/ 24 ноября 2011

Тот факт, что вы сказали, что игроки двигаются случайным образом, означает, что вы, вероятно, пойманы распространенной ошибкой помещения new Random() в цикл. Сделайте ваш случайный объект статичным или переместите его из цикла, и ваша проблема исчезнет.

...