Todo buen IDE (Entorno de Desarrollo Integrado) incorpora entre su conjunto de herramientas un Depurador; es decir, la capacidad de que podamos trazar el funcionamiento de nuestro código, ya sea para solucionar los problemas detectados o bien para comprobar que nuestra aplicación funciona tal y como esperamos que lo haga.
En el caso de Xojo, el funcionamiento del depurador está a la altura del resto de sus capacidades y destaca también por su potencia, sencillez de uso y flexibilidad en cuanto a funciones disponibles.
Probablemente el primer contacto que tengamos con el depurador de Xojo sea cuando ejecutamos nuestra aplicación desde el IDE y se produce algún tipo de error en el código, dado que el resultado es, precisamente, que el IDE pasará a un primer plano presentando una nueva pestaña: el Depurador.
Será en esta nueva pestaña del Depurador donde se muestra tanto el fragmento de código responsable del error (en concreto, la línea que ha provocado este “salto”), con el panel de estado de la Pila (parte inferior izquierda de la ventana), y el panel de estado de las variables y objetos disponibles en ese punto de la ejecución (parte inferior derecha).
Además, en la parte superior de la pestaña del Depurador de Xojo encontraremos la barra de herramientas donde tendremos acceso al conjunto de opciones que nos permiten reanudar la ejecución del programa en curso, si esto es posible, o bien continuar trazando su funcionamiento paso a paso (una línea de código cada vez).
Por ejempo, tomemos el siguiente fragmento de código incluido en el evento Open de la ventana Window1:
dim a() as string = Array("uno", "dos", "tres") MsgBox a(3)
Este código provocará un error cuando se ejecute la segunda línea, dado que estará intentando acceder a un elemento del Array utilizando un índice superior a la cantidad de elementos disponibles (recuerda que los Array están basados en un índice cero, tal y como te cuento en mi libro “Programación Multiplataforma Xojo”).
Por tanto, si ejecutásemos la aplicación ya compilada —es decir, como una aplicación estándar independiente del IDE—, el resultado sería que dicho programa terminaría su ejecución de forma abrupta presentando al usuario un mensaje de error; pero si lo hacemos desde el IDE, el error será capturado por Xojo y nos presentará el Depurador, permitiendo así que podamos detectar cuál ha sido el problema y actuar en consecuencia:
En concreto, puedes ver que la línea de código causante del problema está identificada con el gráfico de un simpático bicho (bug, en inglés), al tiempo que también podemos ver el tipo de error (Excepción) y descripción del mismo (OutOfBoundsException) entre la información disponible en el panel inferior derecho de la pestaña del Depurador.
Estos datos proporcionan una información más que suficiente para identificar la causa del problema; de modo que modifiquemos el código para que no se vuelva a producir el error en la próxima ejecución de la aplicación.
Esto es algo que puedes hacer pulsando sobre el icono con forma de Lápiz en la barra de herramientas del depurador, opción que activa el modo de Edición. Como resultado no sólo podrás realizar los cambios en el código causante del problema, sino en cualquier fragmento de código de la aplicación, e incluso añadir nuevo código si así lo deseas.
Es importante tener en cuenta, no obstante, que los cambios realizados en el modo de edición no se aplicarán de forma inmediata durante la actual sesión de depuración; es decir, mientras que se esté ejecutando la aplicación. Dichos cambios en el código si serán activos si detenemos el depurador y volvemos a ejecutar el programa desde el IDE (o bien compilando la aplicación).
Editar valores
Los cambios de edición que sí tendrán efecto de forma inmediata durante la sesión de depuración son los correspondientes a aquellas variables y/o propiedades de objeto a las que tienes acceso mediante el panel de Variables del Depurador.
Como puedes observar, la columna ‘Value’ muestra el valor asociado con el elemento indicado en la columna ’Name’, utilizando para ello un estilo que recuerda notablemente al utilizado en los hiperenlaces Web. Pues bien, esto significa que al hacer clic sobre dicho texto el Depurador pasará a mostrarnos una información más detallada sobre los datos de la variable u objeto asociados.
En el ejemplo mostrado en la imagen superior, se puede ver el detalle correspondiente a los contenidos del Array en la variable ‘a’. Nuevamente, esto también nos confirma que el índice máximo que podemos utilizar para acceder a uno de sus valores es ‘2’.
También puedes observar el icono de una pequeña lupa y lapicero a la derecha de cada uno de los valores mostrados. Haciendo clic sobre dicho icono se accede a una nueva vista de detalle en el panel, donde no sólo podrás ver con mayor detalle el valor en cuestión, sino también editarlo. En el caso de que se modifique aquí el contenido del valor, dicho cambio sí será aplicado de forma inmediata. Esto significa que si continúas la ejecución del programa, este será el nuevo valor utilizado, y no el original, lo que puede resultar conveniente en determinados casos.
Definir puntos de parada en el Depurador Xojo
Si bien el Depurador aparece cuando se detecta un error en la ejecución del programa lanzado desde el IDE, el uso más frecuente (y útil) es el que nos permite decidir de forma activa en qué punto o puntos deseamos que se detenga la ejecución de nuestras aplicaciones.
Entre otras cosas, esto nos permite examinar el estado de nuesta aplicación en un método, función o línea determinados del código, ya sea para resolver algún problema detectado o bien para comprobar que el flujo en la ejecución del código es el esperado.
Como puedes ver en la imagen superior, el Editor de Código cuenta con una pequeña columna de color gris sobre la cual se indica con una línea horizontal las líneas de código sobre las que podemos deifnir un punto de parada. Para ello, es suficiente con hacer clic con el apuntador del ratón sobre dicha línea y el Editor de Código de Xojo añadirá un punto de color rojo (tal y como se muestra en la parte derecha de la imagen superior). Esta es la forma visual que tiene el IDE de mostrarmos en qué partes de nuestro código se detendrá temporalmente la ejecución de la aplicación para dar paso a la pestaña del Depurador.
De igual modo, sólo tendremos que hacer clic con el apuntador del ratón sobre la marca de punto de parada para eliminarla. Por otra parte, en el caso de que hayamos definido varios puntos de parada a lo largo de nuestra aplicación, siempre podemos utilizar el comando de menú Project > Breakpoint > Show all para que el panel inferior del IDE nos muestre un listado con todos los puntos de parada definidos. Al hacer clic en cada una de las entradas accederemos a la línea de código correspondiente.
Entre las opciones del menú Project > Breakpoint también encontramos las opciones para eliminar todos los puntos de parada definidos en el proyecto, o bien sólo los puntos de parada correspondientes al fragmento de código mostrado en ese momento por el Editor de Código.
Parada condicional en el Depurador
En algunos casos el hecho de definir un punto de parada no supone la mejor opción. Por ejemplo, esto es lo que ocurre cuando nos gustaría trazar el funcionamiento de nuestra aplicación sólo a partir de que se cumpla una condición determinada.
Esto es algo que podemos lograr, precisamente, utilizando la palabra clave Break. Cuando una aplicación ejecutada desde el IDE alcanza una línea de código que contenga dicha palabra clave, saltará automáticamente al Depurador. Mi recomendación es que utilices esta capacidad asociada a una comparación del compilador, de modo que sólo se ejecute cuando se esté ejecutando la aplicación desde el IDE, ¡y no una vez que hayamos desplegado la aplicación! Por ejemplo, esto es lo que lograríamos utilizando el siguiente fragmento de código:
#if DebugBuild if n = 5 then break #Endif
En este caso estaríamos indicando que se detenga la ejecución del programa (Break) cuando el valor de la variable ’n’ sea 5, y siempre y cuando la aplicación se esté ejecutando en modo de depuración; es decir, desde el IDE. Al ejecutar el programa, este lo hará con normalidad hasta que se cumpla la condición, momento en el que se activará la pestaña del Depurador, tal y como se muestra en la siguiente imagen (observa que no se ha precisado del uso de ningún punto de parada):
Depuración Remota
Xojo no sólo es un entorno de desarrollo multiplataforma, sino que también es un entorno de desarrollo de compilación cruzada. ¿Qué significa esto? La capacidad de que podamos ejecutar el IDE desde cualquiera de los sistemas operativos soportados (OS X, Windows, Linux), y crear los ejecutables no sólo para el sistema operativo sobre el que se está ejecutando el IDE, sino también para el resto de las plataformas soportadas (ojo, sólo en el caso de las licencias Desktop, Pro y Enterprise).
Y esto mismo es algo que también podemos aplicar por supuesto en la depuración de nuestras aplicaciones, ya sea utilizando máquinas virtuales sobre las cuales ejecutar otros sistemas operativos, o bien otros equipos disponibles en la red local o a los que tengamos acceso siempre que estén conectados en red y accesibles desde Internet.
Para realizar la depuración remota de nuestras aplicaciones desde el IDE, tendremos que instalar sobre cada uno de dichos equipos la aplicación Remote Debugger Desktop que podemos encontrar en la carpeta Xojo > Extras > Remote Debugger Desktop (o Remote Debugger Console, en el caso de que queramos ejecutar la versión de consola).
Posteriormente, podremos añadir todos los equipos remotos a los que deseamos tener acceso mediante el menú Project > Run Remotely > Setup… Cuando invocamos dicha opción de menú veremos una ventana como la siguiente:
Mientras que en las máquinas remotas cliente (aquellas que recibirán los ejecutables) también puedes configurar algunas capacidades en la aplicación Remote Debugger Desktop, tal y como se muestra en la imagen:
Por ejemplo, no sólo puedes indicar el puerto por el que se realizará la conexión o la cantidad máxima de conexiones simultáneas admitidas, sino que también puedes definir una contraseña para permitir la depuración remota sobre dicho equipo sólo en los casos donde el usuario del IDE también conozca dicha contraseña, así como la ubicación en la que se almacenarán los ejecutables recibidos.
Una vez que se ha realizado la configuración de los equipos remoto cliente, y se han añadido estos al IDE, ya se puede utilizar la opción de menú Project > Run Remotely > Nombre_de_equipo Eso sí, ¡asegúrate de haber activado previamente la compilación de tu aplicación para el sistema operativo de destino!
El IDE de Xojo procederá a compilar la aplicación, enviarla al equipo remoto por red (ya sea un equipo físico o máquina virtual) y lanzar la aplicación sobre dicho equipo remoto.
Tal y como si se tratase de una sesión de depuración local, el Depurador del IDE se activará cuando se alcance un punto de parada o bien en el caso de que el programa halle un error que active el depurador.
Personalmente, prefiero utilizar máquinas virtuales para depurar mis aplicaciones, y no sólo para hacerlo sobre los sistemas operativos diferentes al equipo sobre el que ejecuto el IDE, sino también para contar con sistemas operativos limpios sobre los cuales probar los programas. De ese modo me aseguro de que no haya otros elementos que puedan estar afectando la ejecución del programa en cuestión.
Conclusiones
Como hemos visto, las capacidades de depuración de Xojo son realmente notables y, sobre lo comentado en este artículo, también contamos por supuesto con el conjunto de herramientas que nos facilitan ir trazando línea a línea la ejecución del programa, acceder al código en la llamada a una función o método… o bien saltarlo, evitando así, trazar cada una de las líneas de un fragmento de código ya probado.