miércoles, 19 de noviembre de 2014

Más novedades en la depuración con ZinjaI

Ya les comentaba en otros posts que venía haciendo cambios importantes en ZinjaI para la próxima versión, y especialmente en lo relacionado a la depuración y el manejo de inspecciones. Y como algunos son cambios muy grandes, esta próxima versión se viene demorando bastante. Pero creo que la espera va a valer la pena, porque así como por un lado estos cambios son grandes y lentos de implementar, por el otro lado los resultados son especialmente útiles. Todo rediseño en las tripas de un software, si se hace después de un tiempo prudencial y de haber aprendido mucho de los errores (u ordenado más precisamente, de haber aprendido de muchos errores), facilita el trabajo futuro, permitiendo pensar en cosas que antes no eran posibles o requerían demasiado trabajo. Y les vengo a mostrar un ejemplo de eso, que parece bastante mágico si se lo mira desde el ángulo adecuado.


El video (véanlo antes de seguir leyendo) muestra algunas de las nuevas vistas que ZinjaI ofrece para las inspecciones (ya sean las de la tabla, o las evaluaciones al vuelo poniendo el mouse sobre una variable). De ellas, hay una permite modificar los valores que guarda la variable inspeccionada durante la ejecución y sin necesidad de interrumpirla (mucho énfasis en la palabra "durante"). Siempre fue posible modificar un valor mediante la grilla de inspecciones, pero para ello había que interrumpir antes la ejecución. Esta nueva vista se presenta en una ventana independiente que puede mantenerse junto a la de ejecución, y automatiza el proceso generando la ilusión de que la ejecución nunca se detiene. En realidad sí se detiene. Cuando cambiamos un valor en esta vista, ZinjaI pausa la ejecución, modifica la variable, y luego retoma la ejecución, pero hace todo muy rápidamente y de forma transparente. Visto así, no parece algo taan mágico, pero tiempo atrás era impensable intentar implementar este tipo de cosas sin sufrir en el intento.

La idea surgió al ver un amigo trabajando con Unity, entorno que permite hacer esto (seguir las propiedades de un objeto, y editarlas en tiempo real) muy fácilmente, gracias a mecanismos más complejos y mucha ayuda de la reflexión, cosa que no hay en C++. Pero viendo eso aplicado a un ejemplo concreto, pensé que en ese caso particular podría suplirse la falta de reflexión del lenguaje con la información de depuración del ejecutable, y simularse entonces esta edición alterando la memoria mediante variable-objetcs (lo que hay detrás de las inspecciones, a nivel gdb). Ahora en el código de ZinjaI, después de una limpieza importante en la clase que hace la comunicación con el depurador, y después de escribir un nuevo y mejor mecanismo interno para la gestión de estas cosas, agregar una ventana como esta requiere solo trabajo de interfaz, siendo entonces un tarea relativamente fácil y rápida. Así es que pude hacer el ejemplo del video en una clase con algo así como 100 lineas de código en total, donde más de la mitad son copy-paste de otras vistas, y el 95% es la lógica y el mantenimiento de la interfaz.

Ahora que me siento más cómodo con el código que da soporte a estas ideas, espero ir encontrando de a poco muchas otras ideas nuevas para ofrecer todo tipo de vistas útiles que permitan explotar mejor las capacidades del depurador. Ya hay publicada una versión de prueba para que los que quieran empiecen a experimentar con esta y las muchísimas otras mejoras que ya hay implementadas para la próxima versión, y de paso si encuentran cosas raras o mejorables aporten algo de feedback al proceso.

4 comentarios:

  1. Realmente genial esto del depurador. Me copa que se pueda ver ese tipo árbol con los atributos. Realmente espectacular, me encanto! =D

    Te consulto una cosa que uso de vez en cuando (que salio en la ultima version del visual studio, que capas ya lo hiciste en zinjai y yo ni enterado) poder seleccionar un bloque de codigo y decir, "quiero que esto este dentro de un if, o de un while o de un bloque try-catch" y te salga un cuadrito donde puedas elegir entre todo eso para que el codigo seleccionado quede dentro de este "auto codigo" que se generaria - Elemplo:

    linea de codigo 1
    linea de codigo 2

    - Selecciono estas dos lineas, "apretas una combinacion de teclas", sale un cuadrito que te permite elegir y por ejemplo las colocas dentro de un if y automaticamente me genera el if con el codigo que seleccione adentro.

    if(true){
    linea de codigo 1
    linea de codigo 2
    }

    Es un ejemplo tonto y la funcionalidad no es re wow pero para casos grosos puede ser útil, capas estoy pensando solo en los ejemplos sencillos que hicimos en la materia pero por lo menos yo en el visual, con C#, lo uso a veces.

    ResponderEliminar
    Respuestas
    1. Es buena la idea, podría poner algunas opciones como esta en un submenú del menú contextual para que los usuarios las vean y las usen. Ahora tengo la próxima release casi lista, pero después de eso seguro que algo así pruebo agregar. Total con la cantidad de cambios que hay no creo que pase mucho tiempo desde la próxima release a la siguiente.

      Eliminar
  2. Hola Pablo!!
    Magnifica esta funcionalidad.
    Una consulta: A que te referis con falta de reflexión del lenguaje C++?

    ResponderEliminar
    Respuestas
    1. Que el código pueda consultar sus propiedades... Por ejemplo, preguntarle a una clase qué métodos tiene... o si tiene tal o cual miembro. Hay propuestas para agregar esto, pero probablemente lleguen con c++23, o c++26. https://es.wikipedia.org/wiki/Reflexi%C3%B3n_(inform%C3%A1tica)

      Eliminar