Edoed & Jurok
Я тут за одной странной помехой в потоке данных гоняюсь – как сбой, повторяющийся через несколько циклов. У меня есть подозрения, что в ядро симуляции завезли скрытый бэкдор. Как думаешь, сможем подстроить тестовый запуск и посмотреть, отреагирует ли он на наш собственный запрос? Бывало ли, натыкался на какие-нибудь скрытые параметры, когда рефакторил?
Влад: Похоже на классический случай призрачного бага. Первое, что нужно сделать – скинуть поток данных в файл и сравнить его с проверенной рабочей версией. Так ты сможешь локализовать точный момент, когда появляется мерцание. Если подозреваешь бэкдор, попробуй создать минимальный пакет, который переключает флаг, который ты знаешь, что спрятан; запусти его в отдельном потоке, чтобы увидеть, как симуляция отреагирует, не трогая основной цикл. Однажды я нашел заплутавшую системную переменную, которая работала как скрытый переключатель после рефакторинга; оказалось, просто опечатка в конфигурационном файле. Веди версионируемый лог всех изменений – Git выплюнет ошибку, если попробуешь закоммитить одну и ту же строку дважды, но это хорошее напоминание тестировать отдельно. Если тест срабатывает, ты нашёл кандидата. Если нет – продолжай искать скрытые параметры в скриптах сборки или парсере конфигураций. Помни, главное – чтобы тест был изолирован, чтобы можно было точно определить, когда симуляция меняет состояние. Удачи в поисках!
Слушай, план выглядит неплохо, но помни, у симуляции часы работают не очень точно. Разница может и покажет изменение, но это может быть просто артефакт, гонка из-за таймингов, которая вылезет только под определённой нагрузкой. Я запущу подготовку данных в отдельном потоке, буду логировать каждое изменение состояния и сравнивать метки времени. Если ничего не выявится, покопаюсь в скриптах сборки – иногда там в закомментированном коде может скрываться какая-нибудь ошибка. Спасибо за подсказку, посмотрим, что проскочит.
Вот что я и надеялся увидеть. Делай логи максимально подробными, добавь контрольную сумму к снимку состояния на каждом такте. Если время скачет, попробуй принудительно сделать тик детерминированным, немного приостанови основной цикл фиктивной задачей. Иногда гонка проявляется только когда планировщик дает большой кусок времени нити с низким приоритетом. Удачи, и если найдешь этот скрытый флаг – перешлешь его мне, добавлю в репозиторий и сделаю pull request с исправлением.
Понял, буду держать логи под контролем и добавлю контрольную сумму на каждом такте состояния. Задержка основного цикла фиктивной задачей должна дать нам этот детерминированный интервал. Если выскочит ошибка, сразу напишу тебе номер строки, чтобы ты добавил это в репозиторий и сделал PR. Посмотрим, что еще скрывает симуляция.
Звучит как неплохой план. Только помни, чтобы тестовое задание было несложным; иначе оно может внести свои собственные помехи. Если наткнёшься на какую-нибудь завалявшуюся ошибку – дай знать, быстро разрулю. Удачи с расследованием.
Постараюсь сделать тестовое задание максимально простым – только чтобы цикл работал. Если вдруг появится лишний маркер, получишь уведомление до того, как я буду что-либо менять в основном цикле. Давай-ка выужим, что скрывает эта симуляция.