Es recomendable la lectura de los artículos anteriores para comprender mejor el actual:
- GameBoy Dev00
- GameBoy Dev01
- GameBoy Dev02
- GameBoy Dev03
- GameBoy Dev04
- GameBoy Dev05
- GameBoy Dev06
- GameBoy Dev07
- GameBoy Dev08
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:
Habilitamos la depuración remota:
Tools -> Remote Debugging -> Enabled
Podemos ver que ha quedado un socket a la escucha:
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
Podemos ver que nos ha generado algunos ficheros adicionales:
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