SeniorДебаггингРедкоЕщё не отвечали
Какие ловушки рефлексии делают Live Coding / hot-reload ненадёжным для изменений UObject?
Разработчик добавляет новое UPROPERTY в UCLASS, применяет изменение через Live Coding (Ctrl+Alt+F11) без перезапуска редактора, и патч проходит успешно — но через мгновение редактор падает с assert. В логе:
LiveCoding: Patch applied successfully (1 module).
...
LogUObjectGlobals: New UPROPERTY 'AmmoReserve' added to AWeapon
Assertion failed: !Object->IsUnreachable() [GarbageCollection.cpp]
Fatal error: object referenced but not visible to the reference graph
Определите причину.
Live Coding патчит машинный код на месте, но не может пересобрать рефлексию: новое или переименованное UPROPERTY, изменённая раскладка UCLASS или другой vtable требуют свежего .generated.h от UHT, который применяет лишь полный перезапуск редактора. Если всё же запатчить, останутся устаревшие vtable, свойства, невидимые для GC и сериализатора, и часто assert в GC. Изменения заголовков и CDO всегда требуют перезапуска.
- ✗Добавить
UPROPERTYво время сессии Live Coding и ждать, что оно станет видимым для GC - ✗Считать, что Live Coding перезапускает UHT, и рефлексия остаётся синхронной с патчем
- ✗Воспринимать assert в GC при hot-reload как случайный, а не симптом устаревшей раскладки
- →Какие виды правок действительно безопасно применять через Live Coding?
- →Почему устаревший vtable может пережить патч и вызвать неверный виртуальный вызов?