600 likes | 736 Views
Tutores: Miguel Ángel Pérez Aguiar José Fortes Gálvez. VISUALIZADOR DIDÁCTICO DE EJECUCIÓN PARA LC99. Autor: Daniel Bautista de Cabo. Facultad de Informática Universidad de Las Palmas de G.C. El proceso de la ejecución. El Visualizador de Ejecución. Contenidos. Introducción
E N D
Tutores: Miguel Ángel Pérez Aguiar José Fortes Gálvez VISUALIZADOR DIDÁCTICO DE EJECUCIÓN PARA LC99 Autor: Daniel Bautista de Cabo Facultad de Informática Universidad de Las Palmas de G.C.
El proceso de la ejecución Visualizador Didáctico de Ejecución
El Visualizador de Ejecución Visualizador Didáctico de Ejecución
Contenidos • Introducción • Estado inicial del tema • Metodología seguida • Recursos utilizados • Planificación y desarrollo del proyecto • Resultados y conclusiones • Trabajo futuro Visualizador Didáctico de Ejecución
¿Qué es LC99? • Lenguaje inspirado en Algol y Pascal • Desarrollado en la E.U.I. de la ULPGC • Características interesantes para la gestión de memoria (didáctico) • Existe un compilador y actualmente no acepta todo el lenguaje • El compilador genera “código P” Visualizador Didáctico de Ejecución
Estado inicial (I) • Proyecto muy relacionado con un depurador (gráfico): • Depuradores capaces de controlar flujo de un programa • Depuradores pueden consultar estado de un programa (variables, argumentos, registros, memoria) • Pero, ¿es un depurador lo suficientemente didáctico para estudiar el modelo de gestión de la memoria? • Estudio de los depuradores actuales Visualizador Didáctico de Ejecución
GDB (GNU DeBugger) • El GDB es un depurador conocido • Puede depurar programas en C, C++, Pascal, Fortran, Modula2, Ada y otros • Modo texto (consola) “crudo”, no didáctico • Sin embargo, cubre todas nuestras necesidades de contenidos Visualizador Didáctico de Ejecución
DDD • Depurador gráfico más conocido en Linux • Sólo una GUI, su motor es el GDB • Permite interacción directa con el GDB • Potencia GDB + Amigabilidad visual • Sin embargo, sigue siendo “crudo” con la visualización de la memoria (simplemente encierra el texto del GDB en ventanas) Visualizador Didáctico de Ejecución
Estado inicial (II): Conclusión • Mismo problema en todos los depuradores estudiados: visualización pobre de la memoria • Esto es lógico, dado el fin de un depurador: un programador no suele estar interesado en el modelo de gestión de la memoria • No encontraremos un depurador que funcione como visualizador didáctico • Detalle interesante: potencia y capacidad del GDB de aceptar varios lenguajes Visualizador Didáctico de Ejecución
Metodología (I) • Se ha seguido un ciclo de vida en cascada • Se ha utilizado UML para diseñar y documentar • Documentación durante el desarrollo • Otras metodologías (PUD, …) eran excesivas para este proyecto Visualizador Didáctico de Ejecución
Metodología (II) Visualizador Didáctico de Ejecución
Recursos utilizados • Se ha tratado de usar software libre cuando ha sido posible: • Borland Kylix 3 Open Edition, IDE Builder(en Windows: Borland C++ Builder) • Herramientas GNU: GDB, GCC, GPC, GNAT, G++, G77 • GNU para Windows: MinGW, Cygwin Visualizador Didáctico de Ejecución
Planificación (300 horas) Visualizador Didáctico de Ejecución
Tiempos y porcentajes (300 horas) Visualizador Didáctico de Ejecución
Análisis (I) • Qué queríamos: • Herramienta con potencia de depurador: control del programa, recuperación de valores, etc. • Herramienta que visualice la memoria de forma didáctica • Herramienta que acepte el LC99 (completo) • Herramienta extensible (que pueda aceptar otros lenguajes) Visualizador Didáctico de Ejecución
Análisis (II) • Identificación de elementos de visualización: • Código fuente • Código máquina (ensamblador) • Pila • Registros • Resto de la memoria • Inspiración: depuradores + apuntes de gestión de memoria Visualizador Didáctico de Ejecución
Análisis (III) • Estudio de los depuradores • Dos hechos interesantes: • Potencia del GDB al aceptar varios lenguajes • Que DDD (y otros) utilizaran al GDB Visualizador Didáctico de Ejecución
Análisis (IV) • Idea: Diseñar e implementar un visualizador que use GDB (como el DDD) • Problema: GDB no acepta código generado por compilador de LC99 (genera “código P”) • Solución: cambiar código generado por compilador de LC99 (backend) Visualizador Didáctico de Ejecución
Estudio del GDB • ¿Cómo obtiene el GDB información semántica sobre un programa? • Entrada GDB: ejecutable • Hay que compilar con la opción “-g” • ¿Qué ocurre cuando se especifica esa opción? Visualizador Didáctico de Ejecución
Los STABs .stabs “c(0,1)”,128,0,2,-4 Indica que hay una variable “c” entera en la posición -4 a partir del registro %ebp • Con opción “-g”, el compilador añade más líneas al código generado (ensamblador) • Cada una de esas líneas se llama STAB • STAB=Symbol TABle: codifican información semántica • Los STABs especifican los nombres de las variables, argumentos, funciones; línea fuente en que han sido declarados; de qué tipo son; y su lugar en memoria Visualizador Didáctico de Ejecución
Nuevo compilador de LC99 • Habrá que cambiar el código generado: • De “código P” a código ensamblador AT&T i386 (parecido a Intel pero con pequeñas diferencias) • Añadir líneas de STAB al código i386 generado Visualizador Didáctico de Ejecución
Diseño (I) Visualizador Didáctico de Ejecución
Diseño (II) • “Intermediario” entre el GDB y el visualizador (VDE) • Principio de diseño: encapsular lo que cambia • El intermediario envía órdenes y recoge respuestas del GDB y se las pasa al VDE Visualizador Didáctico de Ejecución
Diseño (III) Visualizador Didáctico de Ejecución
Diseño (IV) • Realimentación entre diseño e implementación: nuevas ideas que han hecho necesario rediseñar • Patrones de diseño: Mediator, Singleton Visualizador Didáctico de Ejecución
Implementación (I) • Lenguaje utilizado: C++ • Experiencia • Se usa la librería LibC • GUI (Kylix/Builder) • Propuesta inicial: Delphi • Productividad • Experiencia Visualizador Didáctico de Ejecución
Implementación (II): fork VDE fork • En Windows: Win32 API • CreateProcess() • Anonymous Pipes VDE (hijo) VDE exec pipe GDB dup Visualizador Didáctico de Ejecución
Implementación (III): GDB • Intermediario analiza y estructura repuestas de salida estándar del GDB • Respuestas del GDB fijas • Posibilidad de usar GDB MI (Machine Interface), pero sólo disponible a partir de GDB 5.0 Visualizador Didáctico de Ejecución
Implementación (IV): hilos • Proceso de comunicación: respuesta (visual) VDE GUI acción respuesta petición Intermediario Usuario respuesta comando GDB Visualizador Didáctico de Ejecución
Implementación (V): hilos • Para evitar bloqueos se utiliza concurrencia (hilos): respuesta (visual) VDE GUI acción respuesta VDE::Hilo petición Intermediario Usuario respuesta comando GDB Visualizador Didáctico de Ejecución
Implementación (VI): bugs • VDE soluciona bugs del GDB • Información incorrecta si paramos el GDB en entrada o salida de función • VDE detecta esos casos y, con la información del instante anterior, construye visualización correcta • Si no hubo paso anterior, simplemente no etiqueta valores críticos Visualizador Didáctico de Ejecución
Implementación (VII) • Sentido de la pila: • ¿Hacia dónde crece la pila? • Literatura muestra ambos sentidos • Ningún argumento concluyente: se deja elegir al usuario Visualizador Didáctico de Ejecución
Implementación (VIII) • No se puede ir hacia atrás en el flujo de ejecución • Sin lo anterior, es difícil comparar la pila en dos estados diferentes • Solución: poder capturar estado de pila (snapshot), para comparar más tarde Visualizador Didáctico de Ejecución
Scripts adaptadores (I) • Para algunos lenguajes, el visualizador no se comporta adecuadamente • Sería más correcto decir que el GDB no se comporta correctamente • Enlace estático no se etiqueta como STAB (el LC99 sí lo hace; GPC y GNAT, obviamente, no) • Esto provoca que el enlace estático no se etiquete (aunque sí aparece su valor, adónde apunta, etc.) Visualizador Didáctico de Ejecución
Scripts adaptadores (II) • Implementación de scripts en Perl que modifican código generado (GPC y GNAT) • GPC no funciona con GDB, script logra que funcione Visualizador Didáctico de Ejecución
Scripts adaptadores (III) C (gcc) C++ (g++) Fortran (g77) Ada (gnat) script Pascal (gpc) script LC99 (lc99) Visualizador Didáctico de Ejecución
Pruebas (I) • Se plantearon varias pruebas: • Batería de programas • Pruebas de usuario • Pruebas de sistema o entorno • Pruebas de memoria Visualizador Didáctico de Ejecución
Pruebas (II) • Batería de programas: • Procedimientos anidados (Pascal, Ada, LC99) • Recursividad • Estructuras complejas (arrays, structs) • Clases y objetos (C++) • Hilos, tareas (Ada) • Punteros (C) • Distintos pasos de parámetros (valor, referencia) • Varios fuentes (uses, include) • Optimización (gcc) No optimizar Visualizador Didáctico de Ejecución
Pruebas (III) • Pruebas de usuario: se repartió el VDE a diferentes usuarios • Pruebas de sistema: Windows ME, 2k, XP; Linux (entornos KDE, GNOME, …) • Pruebas de memoria (C++): se usó MemProof para validar que no se pierde memoria Visualizador Didáctico de Ejecución