Gadjet & RigRanger
Гаджет, я тут последнюю версию этого плагина для анимации запустил – каждые две секунды вылетает. У меня ощущение, что он проклятый. Давай сядем, схему нарисуем, попробуем понять, где логика сбивается, пока оно весь проект не угробило.
— Что, блин, происходит? Вылетает каждые две секунды, да? Ладно, заваривай кофе, открывай исходник, проследим стек, нарисуем схему потока данных, посмотрим, где эти нули пропадают, может, где-то утечка памяти. Не забудь заблокировать логи, пометь асинхронные вызовы. Если это какая-то “проклятие”, просто перепишем проблемный модуль, добавим сторожевого пса и выведем отладочный баннер, чтобы видеть, в каком именно кадре всё валится. Код готов? Поехали.
Конечно. Я уже вытащил исходник в редактор, добавил несколько комментариев к трассировке стека и набросал схему потока данных. Все логи перенаправлены, асинхронные вызовы помечены, сторожевой пес готов ловить этот косячный кадр. Посмотрим, где же прячется настоящая проблема.
Отлично, значит, по схеме видно, что корутина постоянно переходит в себя до того, как мьютекс отпустит, вот где прячется проблема. Поставь точку останова на захват, добавь счётчик к счетчику мьютекса, посмотри на кадры стека в реальном времени. Если всё равно падает, попробуем выделить проблемный цикл, сведём его к одному потоку и запустим с AddressSanitizer. Это должно выявить все висящие указатели или неинициализированные данные, которые и вызывают эту напасть. Давай засучим рукава и покончим с этим.
Точки останова, счетчики, да немного молитвы для этого проклятого кода – посмотрим, перестанет ли мьютекс быть призраком. Если опять начнет глючить, выделим цикл, запустим под ASan и проверим, чтобы ни один указатель не преследовал наши потоки. Пора изгонять этого бага.
Окей, заблокируй мьютекс, смотри, как счётчик подскочит. Если всё ещё глючит – запускай ASan, отслеживай кучу, проверь, не течёт ли сборщик мусора. Если ошибка не пройдёт – поставь свой сторожевой механизм, выгрузи стек, перепиши этот блок. Давай отладим это.
Счетчик вырос до трех, все еще в процессе перерегистрации перед выпуском – никакой магии, просто сломанный замок. Я поставил охрану, перехватил логи GC, дамп кучи выглядит чисто. Пора переписать этот блок с настоящим мьютексом и одним потоком. Зафиксируем это дело.
Слушай, вот оно – обычный мьютекс – это наше спасение. Забудь про этот костыль с повторным входом, запри его на замок, сделай весь критический путь в одном потоке, перегони. Как только мьютекс заблокируется, всё перестанет вылетать, призраки рассеются, и мы спокойно сможем перебрать логику анимации. Давай закоммитим исправление и выложим билдом. Если что-то ещё всплывёт – будем копать, но сначала почини этот мьютекс.