shiru8bit

shiru8bit 

Программист, музыкант, самоделкин, ретрогеймер

90subscribers

940posts

Починил Flopster

Одной из задач, которую я планировал решить в процессе написания «дисководного» альбома, была починка VST-плагина Flopster, на котором, собственно, я и пишу альбом.
Дело в том, что этот плагин, как и все мои плагины с GUI, страдает нестабильностью: в Reaper он примерно в одном случае из 5-10 может уронить программу при открытии проекта, без каких-либо сообщений об ошибке: загружаешь проект, и Reaper закрывается. А у некоторых пользователей в FLS это происходило гораздо чаще. Плагинам моим уже много лет, некоторым без малого десять, и я не раз пытался разобраться, в чём же проблема, но ни одна идея не сработала.
Дело в том, что когда я писал эти плагины, а они написаны нормальным голым кодом на C++, а не сконструированы в каком-нибудь SynthEdit, я просто не знал, как это делать. Примеры создания GUI практически полностью отсутствовали. Также отсутствовало понимание, каков вообще жизненный цикл плагина, когда и какие методы вызываются хостом, в каком порядке — VST2.x не отличался хорошей документацией, и так и был deprecated. VST3 же значительно сложнее, и переходить на него я не хотел и не хочу.
Дополнительной проблемой было отсутствие отладки. VST-плагин — это DLL-ка с набором методов, известных хосту. Без хоста её никак не проверить. Поэтому я собирал DLL, загружал в VstHost, Psycle и Reaper, и тестировал там. Если падало, то искал проблему и собирал. К тому же, в старые времена у меня по какой-то причине вообще не собирались плагины в Debug. Таким образом, плагины отлаживались методом тыка: падает — ищу и чиню, не падает — значит работает.
Долгое время я считал, что проблема нестабильности растёт из моего непонимания жизненного цикла плагина и некорректного прикручивания GUI к нему. Типа, возникают гонки доступа, код обращается к ресурсам, которые уже удалены, и так далее. Я обкладывал код всяческими сейфгардами, но это не помогало.
Помог, как водится, ИИ. Обычный чат DeepSeek. Я просто дал ему код трёх разных плагинов и попросил проанализировать проблемы в них. Конечно, проблем там оказалось навалом, но не критических, это скорее просто устаревший менеджмент памяти (без RAII), не лучшая архитектура, и bad practices. Он нашёл некоторые гонки и предложил больше сейфгардов, но это не помогло. Ведь я искал что-то общее, проблему, которую я, предположительно, размножил копи-пастом на все свои разработки.
В итоге ИИ предложил не гадать, а отладиться. И объяснил, как: нужно собрать Debug и включить CrashHandler, а потом анализировать дамп. А я и не знал, что так можно. Debug на новом ПК с новым VS и другой копией VST SDK (легаси, её пришлось искать и собирать из кусочков по репозиториям) удалось наладить, подключил дамп, проанализировал. И оказалось, что общей проблемы-то и нет, а есть частности с неинициализированными переменными. Иногда при загрузке проекта они были в нулях, и всё работало, а иногда в памяти был мусор, и мои сейфгарды пытались освободить память, которая не была выделена. Так как плагины достаточно сложные, в каждом нашлась подобная проблема в разных местах.
Пока починил Flopster, нашёл и исправил в нём конкретные проблемы, погонял, не падало. Позже займусь починкой остальных плагинов, но вообще по хорошему надо бы переписать их на RAII и нормальное представление интерфейса. Но это как-нибудь потом.
Subscription levels6

Микро 16

$0.21 per month
Просто потому что нельзя 8. Даже самая малая поддержка важна. Спасибо!

База 128

$1.62 per month
Для тех, кто просто хочет поддержать. Спасибо!

Супер 256

$3.3 per month
Для тех, кто хочет поддержать. Спасибо!

Кило 320

$4.1 per month
Для тех, кто сильно хочет поддержать. Спасибо!

Мега 640

$8.1 per month
Для тех, кто очень хочет поддержать. Спасибо!

Гига 1024

$13 per month
Для тех, кто крайне хочет поддержать. Спасибо!
Go up