Mokona Guu Center

Un debug lumineux

Publié le

Hier, je discutais anecdotes de debug exotiques, et il m'est revenu celle-ci. Plus exactement, je ne l'ai jamais oubliée ; et pourtant, l'histoire se situe en 1999, il y a donc un petit moment.

Je travaillais à ce moment-là sur un jeu Dreamcast. Le jeu était en fin de développement et nous lancions de plus en plus la build en version « final », c'est-à-dire telle qu'elle sera sera le disque. Optimisée et sans symboles de debug. C'est bien entendu dans ces contextes que les derniers bugs pénibles apparaissent. Et cela n'a pas loupé.

En plein pendant un des premiers chargements du jeu, pendant un écran vide, avant que la barre de chargement n'apparaisse, plantage. C'était le moment avec beaucoup d'initialisation, beaucoup de choses qui se mettent en place. Par chance, ça reste aussi un moment assez limité dans le code. Heureusement.

Cependant, avec aucun log, aucun affichage (il me semble que le système d'affichage n'était pas encore complètement initialisé), impossible de laisser des traces. De plus, dans ce genre de bugs, dès que le code bouge un peu, le bug disparaît, bien entendu.

Alors comment faire ?

Il se trouve qu'il y avait sur le devant des kits de développement des LEDs que l'on pouvait contrôler ; directement ou indirectement je ne me souvient plus. Le debug s'est donc fait non pas au « printf », mais en allumant ou éteignant des LEDs à des moments du code.

Sauf que... ces LEDs ne pouvaient être contrôlés qu'en mode de Debug. L'idée a alors été de prendre des mesures en mode debug des changements de LEDs pour noter le passage des séquences d'initialisation. On aurait pu le faire avec des logs, mais si je me souviens bien, cela introduisait des variations de timings un peu pénibles.

Comme nous savions aussi produire une build « Final » qui fonctionnait en bougeant un peu de code (non, ceci ne constitue par une correction acceptable), nous avons pris un facteur moyen d'accélération entre les deux builds et calculé approximativement, à partir du moment du crash, où est-ce que le programme devait se trouver.

C'était hautement approximatif, mais cela a suffit pour trouver le bug après quelques essais à raffiner la séquence d'allumage des LEDs.