Unity: Mono-JIT-Fehler bringt 64-Bit-Editor vor GDC 2014 zum Absturz

Fünf Tage vor der Präsentation von Unity 5 auf der GDC 2014 stieß das Unity-Team auf einen schwer reproduzierbaren Fehler im neuen 64-Bit-Editor. Der Unity-Bericht vom 22. April 2014 beschreibt zufällige Abstürze unter OS X 10.9, die den Editor zeitweise unbrauchbar machten.

Die Ursache lag im nativen Code, den Mono zur Laufzeit erzeugte. Traces zeigten, dass der Absturz jeweils kurz nach dem Kompilieren der betroffenen Methode auftrat. Mehrere Testläufe führten zu unterschiedlichen Speicherfehlern. Erst der Vergleich von vier eingefrorenen Debugger-Sitzungen machte sichtbar, dass der Stack in jedem Fall 16 Byte größer war als erwartet.

Mono-Trampolines überschreiten die 2-GB-Grenze

Mono verwendet kleine Trampolin-Funktionen, die den JIT-Compiler aufrufen und Informationen zur nachzuladenden Methode enthalten. Der verwendete Near-Call arbeitet mit einem vorzeichenbehafteten 32-Bit-Offset. Im 64-Bit-Editor konnten Trampolines und JIT-Compiler deshalb mehr als 2 GB auseinanderliegen. Der Offset wurde beim Erzeugen des Aufrufs abgeschnitten, wodurch der Code in eine falsche Adresse sprang.

Nach der Eingrenzung der Speicherabhängigkeit konnte das Team den Fehler beheben und rechtzeitig einen stabilen Build für die GDC bereitstellen. Der Fall zeigt, wie stark Speicherlayout und JIT-Ausführung bei einem 64-Bit-Editor zusammenwirken. Ein älterer Beitrag zur Unity-Editor-Serialisierung behandelte bereits zuvor die Folgen von Assembly-Reloads für Entwicklungsdaten.

Weitere News

Weitere News

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein