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í