Cómo usar el depurador Pharo

En Smalltalk, el depurador es una herramienta de diagnóstico para investigar defectos o errores de software. Sin embargo, a diferencia de los depuradores en otros idiomas, Smalltalk Debugger también se puede utilizar para programar, es decir, para escribir su aplicación. Este puede ser un enfoque de programación enormemente conveniente y poderoso.

Vamos a ilustrar esto con un ejemplo. Tenemos una clase realmente simple llamada #Counter:

Subclase de objeto: #Counter
   instanceVariableNames: 'cuenta'
   classVariableNames: ''
   paquete: 'Tutorial'
Contador >> inicializar
   cuenta: = 0
Contador >> addOne
   cuenta: = cuenta - 1
Contador >> cuenta
   ^ cuenta
Contador >> cuenta: c
   cuenta: = c

Hay varias formas de invocar al depurador:

  1. Su programa encuentra un error fatal como "no entendió el mensaje"
  2. Usted resalta una expresión en Playground y hace clic con el botón derecho para seleccionar "Depurar" (o presione Ctrl-Shift-D)
  3. Si inserta una instrucción "Detener ahora" en su código, el Depurador aparecerá cuando se ejecute la instrucción

Ejecutemos lo siguiente en Playground:

Contrarrestar nuevo addOne

Si lo inspecciona (resaltando y haciendo clic con el botón derecho para seleccionar "Inspeccionarlo"), verá que el valor de "conteo" es -1, no lo que esperábamos.

Podemos depurar (investigar) esto ingresando el Depurador (haga clic con el botón derecho para seleccionar "Depurarlo").

Tenga en cuenta que hay tres paneles. El panel Pila es donde puede ver la ejecución completa "pila" para su programa. (Una pila es una estructura de datos utilizada para realizar un seguimiento de las funciones o métodos que se están ejecutando actualmente en su programa. Se llama pila porque a medida que un método llama a otro que llama a otro que llama a otro, acumula una pila de instancias de ejecución que es muy útil para rastrear el comportamiento de ejecución).

El panel Fuente es donde puede ver y editar el código fuente para una función o método en particular en la pila. El panel Variables muestra todas las variables (incluidas las variables locales, las variables de instancia y las pseudovariables) a las que puede acceder el método. La información que se muestra en el Depurador es todo lo que necesita para comprender lo que está sucediendo. A medida que analice esta información, podrá deducir la fuente de su error.

El Evaluador es una ventana tipo patio de juegos para evaluar expresiones que involucran las variables. Esto puede ayudarlo a comprender lo que está sucediendo.

El depurador proporciona una serie de acciones posibles para explorar el comportamiento de su programa. En la parte superior del panel Pila, puede ver varias opciones:

  • Continuar: continuar la ejecución normal como si nada se interrumpiera
  • Reiniciar: has ido demasiado lejos, así que comienza de nuevo desde el principio del método actual
  • Into: ejecute el mensaje / método resaltado y avance para explorar más a fondo
  • Over: ejecuta el mensaje / método resaltado y pasa sobre él, no en él
  • Through: ejecutar a través del método y dentro del bloque de argumentos

Entonces vemos en el depurador que el método #new está resaltado. Ese es el método a punto de ser ejecutado. No estamos interesados ​​en eso; Queremos examinar el método #addOne. Hagamos clic en "Sobre" para pasar a #addOne.

Ahora queremos entrar en #addOne, así que haga clic en "En". Vemos el código en el panel Fuente. Un vistazo rápido hace obvio lo que está mal (normalmente, tendría que analizar el código con mucho más cuidado y minuciosidad): en lugar de un operador de suma, tenemos un operador de resta. Entonces podemos hacer un cambio en el código inmediatamente en ese mismo momento, y guardar:

Agrega uno
   cuenta: = cuenta + 1

¡Ahora podemos continuar con la ejecución (haciendo clic con el botón derecho para seleccionar "Continuar") como si nada estuviera mal! Ese es el poder de la codificación en vivo en Smalltalk.

Arreglamos #addOne. Ahora veamos el método #subtractOne. En Playground, hacemos lo siguiente:

Contrarrestar nueva sustracción

¡Aparece una ventana de notificación que proclama que Pharo "no entiende #subtractOne"! Esto se debe a que el método #subtractOne aún no existe.

La ventana del notificador ofrece varias acciones posibles:

  • Continuar - continuar la ejecución normal
  • Abandonar - abandonar la ejecución
  • Depurar: abre el depurador
  • Crear: crea el método inexistente
  • Informe: esta es una función obsoleta, eliminada en Pharo 7.0

Tenemos la oportunidad de crear el método que falta inmediatamente haciendo clic en "Crear". Luego preguntará en qué clase y protocolo colocar el nuevo método. Agregue el siguiente código:

Contador >> restar uno
   cuenta: = cuenta - 1

Luego guarde esto y continúe la ejecución.

No solo puede crear métodos, sino que también puede crear clases en el depurador. Si codifica una clase inexistente en su método e intenta guardar, el Depurador le dará la oportunidad de "Crear una nueva clase" desde una ventana emergente.

Como puede ver, puede usar el depurador para escribir código tan fácilmente como lo hace en el navegador del sistema. De esta manera, puede escribir código y depurar de forma iterativa, escribir código y depurar, mientras ve exactamente lo que está sucediendo en su programa. Es una forma muy poderosa y holística de desarrollar software. Te animo a dominar este enfoque.