Esta pagina se ve mejor con JavaScript habilitado

GameBoy Dev09: Debugging C code with VSCode/Emulicious

 ·  🎃 kr0m

Es recomendable la lectura de los artículos anteriores para comprender mejor el actual:


Debugear el código de nuestro juego no siempre resulta fácil, hay ocasiones en las que se comportará de forma errática sin una razón obvia, es en estos casos cuando tener un debuger con el que poder parar la ejecución del programa en un punto dado, ver el valor de las variables y avanzar paso a paso no tiene precio.

En el primer artículo de la serie GameBoy Dev ya explicamos como ejecutar ROMs en Emulicious, en esta ocasión iremos un paso mas allá integrando el IDE VisualStuidoCode para poder ejecutar nuestro código de forma controlada, para ello iniciamos el emulador y habilitamos la depuración remota.

Arrancamos Emulicious:

java -jar GBDEV/Emulicious/Emulicious.jar

Habilitamos la depuración remota:

Tools -> Remote Debugging -> Enabled

Podemos ver que ha quedado un socket a la escucha:

sockstat -46 -l -s

USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS       PATH STATE   CONN STATE  
kr0m     java       61884 42 tcp46  *:58870               *:*                                LISTEN

Instalamos la extensión de VisualStudioCode:
https://marketplace.visualstudio.com/items?itemName=emulicious.emulicious-debugger

Podemos hacerlo todo desde el propio VisualStudioCode:

Una vez instalada debemos configurar el path donde se encuentra Emulicious y el binario de Java de nuestro sistema, para ello de damos al engranaje y Configuración de la extensión:

Configuramos los paths:

Para poder debugear el programa este debe ser compilado con ciertas opciones, según la opción esta debe ser habilitada en un paso de la generación del binario u otra:

-Wa -> Parámetros del assembler
-Wl -> Parámetros del linker
-Wf -> Parámetros del frontend

Por lo tanto las opciones necesarias son:

-Wa-l: Create list file/outfile[.lst]
-Wl-m: Map output generated as (out)file[.map]
-Wf--debug: Turns on --debug for compiler, -y (.cdb) and -j (.noi) for linker
-Wl-y: SDCDB Debug output as (out)file[.cdb]
-Wl-w: Wide listing format for map file

Podemos consultar todos los parámetros permitidos en este enlace

Compilamos el útlimo código de la serie GameBoyDev: GameBoy Dev08

~/GBDEV/gbdk/bin/lcc -Wa-l -Wl-m -Wf–debug -Wl-y -Wl-w -o 08.gb 08.c

Podemos ver que nos ha generado algunos ficheros adicionales:

ls 08*

08.c 08.cdb 08.gb 08.map

Ponemos en el código fuente un BreakPoint, puntito rojo a la izquierda del número de línea donde se quiera interrumpir la ejecución.

Para ejecutarlo, clickamos sobre 08.gb, arriba a la derecha del editor -> … -> Debug file

Parará en los BreakPoints y podremos ver el valor de las variables poniendo el ratón encima de ellas.

Además podemos ejecutar el código paso a paso:

F10 -> Paso a paso pero sin entrar en las funciones llamadas
F10 -> Paso a paso pero entrando en las funciones llamadas

También podemos montiorizar el valor de una variable seleccionándola -> Agregar a inspección.

Dejo un vídeo donde se verá más fácilmente su funcionamiento:

Hay veces en las que el código en C ejecutado paso a paso no se comporta como esperaríamos, esto suele ser por las optimizacciones del compilador, en la propia web del plugin se comenta tal comportamiento:

Yo he realizado algunas pruebas con los siguientes parámetros tratando de deshabilitar las optimizaciones pero no parece mejorar:

~/GBDEV/gbdk/bin/lcc -Wf--vc -Wf--debug -Wf--nooverlay -Wf--nogcse -Wf--nolabelopt -Wf--noinvariant -Wf--noinduction -Wf--noloopreverse -Wf--no-peep -Wf--no-reg-params -Wf--no-peep-return -Wf--nolospre -Wf--nostdlibcall -Wa-l -Wa-y -Wl-m -Wl-w -Wl-y 08.c -o 08.gb
Si te ha gustado el artículo puedes invitarme a un RedBull aquí