Вы находитесь на странице: 1из 7

Autor: Reinaldo Togores <reinaldo.togores@unican.

es>
Arquitecto. Profesor Asociado de Tcnicas de Expresin Grfica, Universidad de Cantabria
(Santander, Espaa). Consultor en temas CAD y GIS. Miembro del Autodesk Developers
Network
Pgina WEB Personal: http://personales.unican.es/togoresr

Depurar el cdigo Visual LISP


Hasta ahora nos hemos referido a las nuevas posibilidades que Visual LISP aporta
para el desarrollo de aplicaciones. Pero en el desarrollo de programas nos
toparemos inevitablemente con errores que debern ser detectados y corregidos.
Para ello las herramientas que examinaremos a continuacin

Ayuda

Eliminar Marcas de Comentario

Comentar Bloque

Formatear Seleccin

Formatear Ventana de Edicin

Comprobar Seleccin

Comprobar Ventana de Edicin

Cargar Seleccin

La primera opcin de que disponemos es la


evaluacin inmediata de cada lnea de cdigo
escrita. A medida que vamos escribiendo en la
ventana del editor, es posible seleccionar el
cdigo que deseemos comprobar y pulsar el
botn Cargar Seleccin (ver figura 1).
De inmediato se evala el cdigo seleccionado,
En la figura 2 mostramos el cdigo de un
programa que permite extraer de la lista de
entidad de una LWPOYLINE las coordenadas de
sus vrtices. Seleccionando la lnea
(setq lista (entget (car (entsel))))
y cargando esta seleccin, pasamos a la
pantalla de AutoCAD donde se nos pide
designar un objeto grfico. A continuacin, la
consola Visual LISP nos mostrar el resultado
devuelto, que habr quedado almacenado en
la variable lista.

Cargar Ventana de Edicin Activa

Evaluacin inmediata del cdigo

Figura 1. Barra de Herramientas


Ejecutar: carga, comprueba, formatea y
comenta el cdigo.

Texto seleccionado
Punto de
Interrupcin

Figura 2. Ventana del Editor con cdigo seleccionado y punto de interrupcin.

2000, Reinaldo Togores. Todos los derechos reservados

Ventana Inspeccin (Watch Window)

Aproximacin (Apropos)

Servicio de Smbolos (Symbol Service)

Rastreo (Trace)

Inspeccionar

Consola de Visual LISP

Seleccionar Ventana

Activar AutoCAD

Para comprobar la naturaleza de este dato basta


situar el cursor sobre el nombre de esta variable
y pulsar el botn Inspeccionar (ver figura 3).
As, lnea a lnea sera posible ir comprobando los
efectos de las diversas funciones que podemos
usar para lograr determinado objetivo. Qu
sucedera si nuestro cdigo encerrara un error?
Supongamos que hemos olvidado introducir en
esta lnea de cdigo la funcin car. En este caso,
en lugar de un nombre de entidad obtendremos
una lista del tipo:
(<Nombre de entidad: 16ca638> (0.591659
0.594869 0.0))
que al ser pasada a la funcin entget provocara
un error reflejado en la Consola con el mensaje:
; error: tipo de argumento errneo:
lentityp (<Nombre de entidad: 16d0638>
Figura 3. Barra de Herramientas Ver:
(0.591659 0.594869 0.0))
inspector de variables, rastreo de la
donde lentityp es un predicado que indica la
ejecucin, servicio de smbolos,
bsqueda por aproximacin y
naturaleza del argumento que la funcin entget
ventana
de inspeccin en tiempo
esperaba recibir (un nombre de entidad) y lo que
real.
realmente ha recibido.
La Tabla 1 muestra algunos predicados asociados a mensajes de error. La
documentacin de Visual LISP es deficiente en este sentido, no aclarando el
significado de estos mensajes.
Predicado:
Argumento que se espera:
stringp
De tipo cadena (string)
numberp
Numrico (real o entero)
listp
Una lista
fixnump
Un nmero entero
lentityp
Un nombre de entidad
lselsetp
Un conjunto de seleccin
VLA-OBJECT
Un objeto Visual LISP ActiveX
output-streamp
Una salida a archivo de texto
streamp
Un archivo abierto para lectura o escritura
Tabla 1. Predicados asociados a mensajes de error

2000, Reinaldo Togores. Todos los derechos reservados

Puntos de interrupcin (Break Points)

2000, Reinaldo Togores. Todos los derechos reservados

Indicador de Posicin (Step Indicator)

ltimo Punto de Interrupcin (Last Break Point)

Anadir Inspeccin (Add Watch)

Act/Des Punto de Interrupcin (Toggle Break point)

Restablecer (Reset to Top Level)

Descartar (Quit Current Level)

Continuar (Continue)

Ir al Final (Step Out)

Pasar al Siguiente (Step Over)

Entrar (Step Into)

Identificada
una
funcin
problemtica,
desearemos ver su funcionamiento paso a
paso. Introduciendo puntos de interrupcin se
detendr
la
ejecucin
del
programa
permitiendo comprobar su operacin en
detalle. Para ello disponemos del botn
Activar/Desactivar Punto de Interrupcin (ver
figura 4), la correspondiente opcin del men
Depurar (Debug) o simplemente la tecla de
funcin F9.
El programa se ejecutar hasta llegar al
primer punto de interrupcin. Al llegar ah, el
control pasa a la Consola y vemos resaltada la
expresin en la ventana del Editor.
Observemos que el smbolo (prompt) de la
consola aparece ahora numerado: _1_$ lo que
nos indica que estamos en un nuevo bucle de
evaluacin (read-eval-print loop) anidado bajo
el bucle superior (top-level) que es donde se
ha llamado al programa.
Figura 4. Barra de Herramientas
Depurar: control de la evaluacin en
Podemos controlar el paso a que se evalan
modo interrupcin, colocacin de
las expresiones mediante los botones Entrar
puntos de interrupcin y aadir
(Step Into) que se detiene en cada expresin
variables a inspeccionar.
anidada, Pasar al Siguiente (Step Over) que
evala toda la expresin resaltada, o Ir al
Final (Step Out) que busca el final de la
funcin donde el programa se ha detenido y
efecta la evaluacin hasta all.
Durante este estado de interrupcin es posible
evaluar expresiones en la Consola que nos den
informacin sobre el contenido de las variables
(tecleando el nombre de la variable y pulsando
INTRO) e incluso cambiar el contenido de las
mismas a partir de la evaluacin de cualquier
funcin en la consola o empleando el Servicio
de Smbolos (ver Figura 5).
Pulsando el botn Continuar (ver figura 4), se
pasar al prximo punto de interrupcin si lo
hubiera.
Figura 5. Ventana del Servicio de
Para ascender un nivel (ya que pueden darse
Smbolos
varios bucles de interrupcin anidados) se
pulsar el botn Descartar (Quit Current Level) y para regresar directamente al
nivel superior, el botn Restablecer (Reset to Top Level).
El programa entrar de manera automtica en un bucle de interrupcin al encontrar
un error en tiempo de ejecucin siempre que se encuentre activada la opcin
Interrupcin en Error (Break on Error) del men Depurar (Debug). En ese estado
tendremos acceso al contenido de todas las variables del entorno en que se ha
producido el error, pero no ser posible continuar la ejecucin.
Para conservar los puntos de interrupcin de una sesin de trabajo a otra ser
necesario Guardar Parmetros (Save Settings) desde el men Herramientas
(Tools). Los puntos de interrupcin se pierden al aplicar las operaciones de
formateo automtico.

Copiar en Rastreo/Registro

Ordenar Expresiones

Borrar Ventana

Tenemos tambin la posibilidad de vigilar los


valores que devuelven las funciones. Para ello
es la ventana Inspeccin (Watch). Para abrirla
con el valor de la ltima expresin evaluada se
puede seleccionar la opcin Inspeccionar Ultima
Evaluacin (Watch Last Evaluation) del men
Depurar. O bien pulsar el botn de la barra de
herramientas correspondiente (ver figura 4),
que abre el dilogo Aadir Inspeccin (Add
Watch). Si el cursor estuviera situado sobre el
nombre de alguna variable, este aparecera en
la casilla de lista desplegable.
En caso contrario, podemos escribir su nombre
o elegir el valor por defecto que es la variable
global *LAST-VALUE* (ltima evaluacin). La
ventana Inspeccin (ver figura 6) se actualiza a
medida que los valores de los smbolos
inspeccionados cambian. As, al entrar en un
bucle de interrupcin tendremos siempre a la
vista los valores actuales.

Aadir Inspeccin

La ventana Inspeccin (Watch)

Figura 6. Inspeccin de las variables


seleccionadas en tiempo real.

En cualquier momento estos valores pueden ser copiados a la ventana de Rastreo


(Trace) mediante el botn Copiar en Rastreo/Registro (Copy to Trace/Log). Si
estuviera activada la opcin Act/Des Registro de Rastreo, accesible desde el men
contextual de la ventana de Rastreo, esta informacin tambin se copiara a un
archivo de extensin LOG.

La opcin de Animar
El men Depurar nos ofrece la opcin de Animar (Animate). Al activar esta opcin,
la ejecucin del programa se har toda en modo de interrupcin como si
pulsramos continuamente el botn Entrar (Step Into). El intervalo de tiempo entre
la evaluacin de cada expresin es configurable desde Herramientas>Opciones de
Entorno>Opciones Generales (ficha Diagnstico). Para detener la animacin puede
pulsarse la tecla PAUSA (BREAK) y de esa manera observar y cambiar si fuera
necesario el valor de las variables o colocar nuevos puntos de interrupcin. Al
encontrar un punto de interrupcin en modo Animar, deberemos usar los botones
Entrar, Pasar a Siguiente o Ir al Final para continuar la evaluacin. Tanto en uno
como en otro caso, la ejecucin en modo Animar se reinicia pulsando el botn
Continuar. El modo Animar es sumamente instructivo especialmente cuando en el
programa incluye bucles anidados.

La Pila de Rastreo (Trace Stack)


La Pila de Rastreo contiene el registro histrico de la ejecucin de funciones dentro
del programa. Una Pila (Stack) es una estructura de programacin que se
caracteriza por el orden de entrada y salida de los elementos que almacena: el
ltimo elemento en entrar es el primero en salir. Su inspeccin (durante una
interrupcin del programa) permite observar lo que sucede durante la ejecucin.
El invocar una funcin hace que se incluya un elemento en la pila. Cuando se llama
a otras funciones anidadas, pueden aadirse a ella nuevos elementos. Esto se har
siempre que sea necesario a Visual LISP para recordar la va de salida. En una pila
pueden aparecer cinco tipos de elementos (ver Tabla 2).

2000, Reinaldo Togores. Todos los derechos reservados

Elemento
Contenido
Llamadas a funciones nivel (nombre-funcin {argumento 1} ... )
se presentan los argumentos realmente pasados a la funcin
Palabras clave
nivel :palabra_clave- (datos opcionales)
ocupan los niveles superior e inferior de la pila
Formas del nivel
acciones iniciadas al teclear una expresin en la Consola o al
superior
cargar un archivo o una seleccin.
se incluye cada vez que se encuentra una expresin lambda
Formas lambda
en el programa
Formas especiales
nivel (forma-funcin ...)
muestran las llamadas a funciones foreach y repeat. Los
argumentos no se muestran
Tabla 2. Elementos de la Pila de Rastreo

Para obtener ms informacin acerca de cualquiera de los elementos de la pila se


deber seleccionar y llamar al men contextual pulsando el botn derecho del ratn
(ver figura 7). Algunas opciones de especial inters son:
x Variables Locales (Local Variables): examina el valor que posean las
variables locales en el momento de ejecutarse la funcin
x Posicin de Origen (Source Position): muestra el cdigo fuente resaltndolo
en la ventana del editor.
x Origen del Punto de Llamada (Call Point Source): curiosamente traducido
por Autodesk como "Ejecutar Origen de Punto", muestra la posicin de la
expresin de llamada, al igual que la opcin anterior. La diferencia radica en
que, segn el elemento seleccionado, estar disponible una u otra opcin, y
a veces ambas.

Figura 7. Pila de Rastreo con su men contextual.

Palabras Clave
Una palabra clave indica una operacin especfica que tiene lugar en el entorno
VLISP. La Tabla 3 muestra algunas de las palabras clave que slo aparecern en el
fondo de la pila.

2000, Reinaldo Togores. Todos los derechos reservados

Palabra clave
:ACAD-REQUEST
:DCL-ACTION

:TOP-COMMAND
:USER-INPUT

Operacin
La llamada a la funcin que le sigue en la pila (ms arriba)
fue invocada desde la lnea de comandos de AutoCAD.
Accin llamada desde un cuadro de dilogo. A la palabra
clave le siguen dos cadenas: el nombre del dilogo y el
valor de la variable $KEY. Si un nmero, representa el valor
de la variable $REASON. El elemento que le sigue en la
casilla de arriba describe la llamada a funcin construida a
partir de la cadena asociada al botn de accin.
Funcin invocada al cargar un archivo o seleccin.
Tecleado en la Consola. La casilla de arriba muestra la
expresin resultante.

Tabla 3. Palabras clave (fondo de la Pila)

Entre las palabras clave ms frecuentes que pueden aparecer en la parte superior
de la pila estn las que muestra la Tabla 4.
Palabra clave
:BEFORE-EXP

Operacin
Indica que un programa se est depurando en modo
interrupcin. Indica que se ha entrado en una expresin.
:AFTER-EXP
Igual que el anterior, al salir de una expresin.
:ARQ-SUBR-CALLBACK Llamada normal de AutoCAD a una funcin definida en
VLISP.
:BREAK-POINT
Punto de interrupcin especificado por el usuario.
:ERROR-BREAK
Error en tiempo de ejecucin. La opcin Mostrar Mensaje
(Show Message) del men contextual muestra mensajes
de error ms especficos.
:FUNCTION-ENTRY
Interrupcin al entrar en una funcin, el elemento
siguiente muestra la llamada a dicha funcin
:KBD-BREAK
Se ha pulsado la tecla PAUSA.
:READ-ERROR
Error durante una operacin de lectura.
:SYNTAX-ERROR
Se ha detectado una sintaxis AutoLISP incorrecta
Tabla 4. Palabras clave (extremo superior de la Pila)

Rastreo de Errores
Cuando se produce un error, el estado de la Pila de Rastreo se copia
automticamente a la ventana de Rastreo de Errores (Error Trace), a la que se
accede desde el men Ver>Rastreo de Errores (View>Error Trace).
Como copia que es de la Pila de Rastreo, todo lo explicado sobre sta se aplica al
Rastreo de Errores. La nica diferencia es la siguiente:
Tanto en la ventana de la Pila de Rastreo como la de Rastreo de Errores hay dos
botones. El de la izquierda sirve para Renovar (Refresh) el contenido de la ventana.
Cuando se pulsa este botn despus de salir de un bucle de interrupcin pasando al
bucle de nivel superior, el Renovar la Pila de Rastreo cambiar su contenido para
reflejar la situacin actual, mientras que Renovar el Rastreo de Errores no cambiar
su contenido a menos que se haya producido un nuevo error (ver figura 8).

2000, Reinaldo Togores. Todos los derechos reservados

Figura 8. Comparacin entre la Pila de Rastreo y el Rastreo de Errores. Se ha introducido la


funcin strcat, ilegal en este contexto, para provocar intencionalmente el error.

Conclusiones
Hemos visto las principales herramientas de que dispone el IDE Visual LISP para la
depuracin de errores. No debemos olvidar las otras ayudas disponibles desde el
mismo Editor, tales como la sintaxis coloreada (basta ver un nombre de funcin
que no se coloree de azul para saber que est mal escrito), la deteccin del cierre
de los parntesis, la revisin de sintaxis, el formateo automtico o la introduccin
de comentarios al cierre de las expresiones. Sin olvidar la comprobacin ulterior
que se realiza al momento de compilar la funcin que ya comentamos en nuestro
artculo del mes pasado. Con todo ello disponemos de un entorno poderoso para el
desarrollo de las aplicaciones ms complejas.
Nota: El cdigo fuente de los artculos publicados puede descargarse de:
http://personales.unican.es/togoresr/cadxpress

2000, Reinaldo Togores. Todos los derechos reservados

Вам также может понравиться