Unity-udvikler jagtede mystisk 2-tal i fem dage

Det tog fem dage at finde årsagen til en hukommelsesfejl dybt nede i spilmotoren Unity3D.

Der er fejl, der er så åbenlyse, at man mest risikerer at overse dem, fordi de blinker med neonskrift i kildekoden. Og så er der fejl, der kræver flere dages gravearbejde dybt nede i stakken, før gåden endelig bliver løst. Unity-udvikler Tautvydas Zilys har skrevet et lærerigt blogindlæg om en fejl af den sidste slags.

Fejlen blev rapporteret i Windows-udgaven af spilmotoren Unity3D af en kunde, som oplevede, at deres spil crashede efter fem til ti minutters kørsel.

Så langt så godt. Tautvydas Zilys kunne genskabe fejlen og identificere et område i hukommelsen, som hver gang endte med at blive sat til værdien '2'. Men hvordan det skete var sværere at gennemskue.

Området i hukommelsen blev brugt af en tråd, der havde til opgave at styre, hvornår andre tråde kunne sende og modtage data, og der burde ikke stå '2' i hukommelsen, men derimod '0xDD'.

Noget skrev altså en forkert værdi i hukommelsen, men hvor den kom fra krævede først indsættelse af breakpoints forskellige steder i koden og i stakken, og til sidst måtte Tautvydas Zilys ty til kernel-debugging i Visual Studio for at finde ud af, hvad der skete.

Unitys kode brugte funktionen select() i Windows-biblioteket Winsock. Da Tautvydas Zilys gravede dybere ned, fandt han ud af, at denne funktion blokerede for andre kald, og Unity-udviklerne havde brugt QueueUserAPC() til at omgå blokeringen, men det resulterede i en exception, som kunne ende med at overskrive den pågældende hukommelsesadresse.

»Det er én af den slags fejl, der holder dig vågen om natten. Det tog mig fem dage at løse den, og det er formentligt én af de sværeste fejl, jeg nogensinde har skullet undersøge og løse. Dagens lektie: Lad være med at smide exceptions fra en asynkron procedure, hvis du gør det fra et systemkald!« slutter Tautvydas Zilys sit blogindlæg.

Tips og korrekturforslag til denne historie sendes til tip@version2.dk
Kommentarer (1)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Log ind eller Opret konto for at kommentere