10.2 El Debugger

En primer lugar, necesitamos un ejemplo de código bastante sencillo para analizar. Escribe o copia lo siguiente en un Workspace.

| fileNames |
fileNames := OrderedCollection new.
(DirectoryEntry smalltalkImageDirectory) 
    childrenDo: [ :f | fileNames add: f name ].
fileNames asArray.

Ejemplo 10.3: Nombres de las entradas del directorio

Ahora, puedes pulsar Ctrl-a (select All) y Ctrl-p (select Print-it) para ver el resultado.

ch10-02-DirChildNames

Figura 10.2: Nombres de archivos y directorios en un directorio

 note La clase CharacterSequence tiene varios nombres de categorías de métodos que comienzan por fileman- para convertir nombres de ruta (nombres del sistema para archivos y directorios) en objetos FileEntry y DirectoryEntry. CharacterSequence>>asFileEntry proporciona ejemplos.

Ahora que sabemos qué esperar, veamos paso a paso el procesamiento del código utilizando el debugger (depurador). Elimina el resultado, luego pulsa Ctrl-a (select All) y Ctrl-Shift-D (Debug-it).

ch10-03-DebugIt

Figura 10.3: Depúralo

El panel superior del depurador muestra una vista de la pila de ejecución (execution stack para este fragmento del contexto de ejecución. La forma de entender esto, el modelo de ejecución, es que cada vez que un método envía un mensaje, este y su estado actual, argumentos y variables locales se colocan en una pila hasta que se recibe el resultado de ese mensaje. Si ese mensaje provoca el envío de otro mensaje, el nuevo estado se introduce en la pila. Cuando se devuelve un resultado, se extrae (poped) el marco de la pila y continúa el procesamiento. Esto funciona como una pila de bandejas en una cafetería.

Los marcos de pila se muestran para indicar el receptor y el método apilados. El objeto de enfoque, el receptor, para el marco de pila seleccionado tiene un inspector en los paneles inferiores izquierdos del depurador, en la parte inferior de la ventana.

Los dos paneles inferiores siguientes son un inspector para los argumentos y las variables locales, o temporales, del marco de contexto.

El área más grande muestra el código que se está procesando y resalta el siguiente mensaje que se enviará.

La pila de contextos de ejecución proporciona un historial del cálculo realizado hasta el momento. Puedes seleccionar cualquier marco, ver los valores de instancia en el receptor y ver los argumentos y las variables del método en ese punto.

Las dos filas de botones situadas encima del panel de código ofrecen vistas adicionales y control sobre cómo debe realizar el proceso la ejecución.

Botones destacados en la segunda fila:

Ahora vamos a jugar un poco. Si te desincronizas con las instrucciones aquí, simplemente cierra el depurador y vuelve a empezar con Debug-It.

ch10-04-StepInto

Figura 10.4: Step Into

A medida que avanzas paso a paso en el depurador, cambia el resaltado del siguiente mensaje enviado. Pulsa tres veces la tecla Over. Deberías ver resaltada la línea que comienza por childrenDo:. Ahora pulsa la tecla Into.

ch10-05-FocusObjAndArgs

Figura 10.5: Visualización del objeto de foco y los temporales

El área de pila muestra que el objeto enfocado es un DirectoryEntry. Inspecciona sus valores de instancia seleccionando líneas en el panel inferior izquierdo.

El área de pila muestra que el método de enfoque es DirectoryEntry>>childrenDo:. Este es el método que se muestra en el panel de código.

El argumento para childrenDo: es aBlock. No hay variables de método que mostrar.

Si pulsas Over de nuevo e Into, deberías ver el contexto en el que se está procesando do:.

Este podría ser un buen momento para investigar los inspectores, examinar la pila de arriba abajo y juega un poco con ella. A estas alturas, ya deberías sentirte seguro de que comprendes los conceptos básicos de lo que se muestra aquí.

¡Tienes el control!

Veamos brevemente otra forma de hacerlo.