Durante tiempo hemos usado las gemas ruby-debug-ide y debase junto con la extensión Ruby de Peng Lv para VSCode pero esta extensión está en desuso y teníamos que encontrar una alternativa. Queríamos integrar la gema ‘debug’ y ser capaces de tener el debug integrado en el VS Code.
Nuestro proyecto es un poco especial porque es un SaaS que usa subdominios para identificar los tenants. Además, está programado en Ruby + Sinatra y en desarrollo usamos puma-dev y los que usamos MacOs lo tenemos preparado para que arranque automáticamente al iniciar el equipo.
Preparación del proyecto
Preparando el proyecto para usar la gema ‘debug’, así que lo primero que hicimos fue añadir esta gema en el grupo :development fichero Gemfile
gem 'debug'
A continuación, teníamos que cambiar la forma en la que iniciamos la depuración. Lo estábamos haciendo en el fichero config.ru y lo adaptamos con el siguiente código. Para configurar el modo de depuración hemos de añadir un fichero debug.txt, que no está en el control de versiones, en la raíz de nuestro proyecto.
if File.exist?('debug.txt') ENV['RUBY_DEBUG_NONSTOP'] = '1' ENV['RUBY_DEBUG_OPEN'] = "tcp://127.0.0.1:1234" require 'debug' end
Ahora que lo tenemos todo preparado tenemos que preparar VSCode o Cursor para ser capaces de depurar.
Si arrancamos el programa y tenemos el fichero debug.txt en la raíz, el sistema estará preparado para que VSCode se pueda conectar con el depurador.
Preparación de VSCode o Cursor
Para poder depurar el código en VSCode o Cursor son necesarios 2 pasos:
- Instalar una extensión para rdbg que permita conectar con el debugger
- Preparar una configuración de depuración usando la extensión.
Instalar la extensión VSCode rdbg
El primer paso es ir a las extensiones, buscar la extensión VSCode rdbg e instalarla.

Crear el fichero launch.json
El siguiente paso es crear el fichero que permitirá que VSCode se comunique con el depurador del programa.
Si no tienes el fichero en la carpeta .vscode, lo que has de hacer es crearlo. Para esto ves a la depuración en el menú principal y agrega una configuración en tu proyecto.

A continuación, selecciona la opción “Ruby: attach a process with rdbg”

Y por último ajusta el fichero resultante con los siguientes detalles
{ // Use IntelliSense para saber los atributos posibles. // Mantenga el puntero para ver las descripciones de los existentes atributos. // Para más información, visite: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "rdbg", // "rdbg" is the type of the debugger "name": "Debug Ruby Sinatra", "request": "attach", "debugPort": "1234", // The same port as in the config.ru file "localfs": true // To be able to debug the local files using breakpoints } ] }
Aquí la clave es indicar lo siguiente:
Atributo | Valor | Descripción |
---|---|---|
type | rdgb | Indica la extensión instalada |
debugPort | 1234 | El mismo valor que hayamos configurado en el fichero config.ru |
request | attach | El depurador se conectar con el programa a través del puerto indicado anteriormente. |
localfs | true | Esto es clave para que se pueda conectar con el sistema de archivos y puedas poner breakpoints en el programa |
Iniciando el programa
Ahora el siguiente paso es iniciar el programa. Si usas puma-dev y tienes configurado el proyecto en .puma-dev, esto se hace con la siguiente instrucción en el terminal
touch tmp/restart.txt
Abre el programa en el navegador y carga una página. Ahora llega el momento en el que hemos de conectar VSCode con el programa para poder depurar
Conectando el depurador con el programa en ejecución
Vamos a ejecución y depuración y ejecutamos la configuración que hemos preparado previamente.

Al realizarlo veremos que VSCode y Cursor cambian su aspecto. La barra inferior cambia al color azul (VSCode) o naranja (Cursor) y tenemos una sección para poder realizar la depuración.
Además, podemos colocar los break-points o puntos de depuración en el editor para poder depurar paso a paso.

Accede desde el navegador a una página o desde Postman invoca un end-point y el sistema se detendrá en el primer break-point. A partir de aquí, podrás depurar paso a paso, comprobar variables, …
