NativeAOT Troubleshooting
Runbook operativo per problemi comuni NativeAOT in Moongate v2.
Build and Run Commands
Build AOT (script di progetto):
./scripts/run_aot.sh --root-directory ~/moongate --uo-directory ~/uo
Run stress smoke:
dotnet run --project tools/Moongate.Stress -- --clients 10 --duration 15
Known Failure Patterns
1) Reflection/DI incompatibile con AOT
Sintomo tipico:
MethodInfo.MakeGenericMethod() is not compatible with AOT- stacktrace DryIoc su conversione/risoluzione dinamica
Cause frequenti:
- risoluzione tramite reflection generica runtime
- registrazioni DI ambigue o non esplicite
- codice che usa dynamic factory selection non source-generated
Checklist:
- evitare reflection runtime in path di bootstrap
- preferire source generation già presente nel progetto
- usare registrazioni DI esplicite e costruttori non ambigui
- verificare che non ci siano service collections costruite in modo dinamico
2) Serializer incompatibile con AOT
Sintomo tipico:
- crash o deserialize failure durante load snapshot
- regressioni in publish AOT dopo modifiche a entity/snapshot
Decisione progetto:
- snapshot/journal su
MessagePack-CSharpcon source generation - evitare serializer che richiedono metadati runtime non preservati
Checklist:
- dopo cambio su entity snapshot, rigenerare/buildare
- testare startup con snapshot esistente
- validare roundtrip serialize/deserialize in test
3) Crash subito dopo login in binario AOT
Sintomo tipico:
- crash durante handshake/login o subito dopo
AccountLoginPacket
Checklist rapida:
- lanciare con log
Debug - verificare parser/network session state
- verificare serializer persistence init (
LoadAsync) - provare con snapshot pulito per isolare corruzione dati
4) Errori linker/trimmer
Se usi librerie esterne con reflection:
- aggiungere descriptor in
ILLink.Descriptors.xml - preservare i tipi necessari
- rieseguire publish AOT completo
Pre-flight AOT Checklist
Prima di dichiarare “AOT stabile”:
dotnet test- publish AOT locale
- avvio server AOT con dati reali
- login client reale
- smoke dei path critici:
- movement
- item double click script
- gump callbacks
- command execution
- persistence save/load
Practical Debug Tips
- usa stack trace completo, non solo il primo frame
- confronta sempre run JIT vs AOT sullo stesso dataset
- quando il bug è intermittente, riduci il workload (1 client, no stress)
- quando il bug è deterministic, crea test minimo prima del fix