Apúntate...


Consultas, desarrollo de programas y petición de presupuestos:

lunes, 3 de junio de 2013

Depurar un programa

¿Que es depurar un programa?

"Depuración de programas es el proceso de identificar y corregir errores de programación. En inglés se le conoce como debugging, es que se asemeja a la eliminación de bichos (bugs), manera en que se conoce informalmente a los errores de programación. Se dice que el término bug proviene de la época de los ordenadores de válvula termoiónica, en los cuales los problemas se generaban por los insectos que eran atraídos por las luces y estropeaban el equipo. Si bien existen técnicas para la revisión sistemática del código fuente y se cuenta con medios computacionales para la detección de errores (depuradores) y facilidades integradas en los sistemas lower CASE y en los ambientes de desarrollo integrado, sigue siendo en buena medida una actividad manual, que desafía la paciencia, la imaginación y la intuición del programador. Muchas veces se requiere incluir en el código fuente instrucciones auxiliares que permitan el seguimiento de la ejecución del programa, presentando los valores de variables y direcciones de memoria y ralentizando la salida de datos (modo de depuración). Dentro de un proceso formal de aseguramiento de la calidad, puede ser asimilado al concepto de prueba unitaria."

El 80% del tiempo que dediques a programar una aplicación, se lo vas a dedicar a depurarla, por lo tanto es muy importante que conozcas las herramientas que pone a disposición el Ide de Gambas.


Puntos de Iterupción:

El Ide de Gambas, posee varias herramientas para la depuración, que te harán fácil (o por lo menos más ameno) este trabajo.  Quizás la más importante sean los puntos de interrupción (se pueden crear tantos como los que necesites), que señalan una determinada linea de código que hara que tu programa se pare  cuando llegue a ella y luego se pueda reanudar el programa en el mismo punto.  Una vez que tienes "parado" el programa, puede ver que  valores estan tomando las variables  o incluso ver el estado de las propiedades de los controles

Cuando haces un programa, podemos distinguir varios tipos de errores:

-Errores de sintaxis:
Son los errores más fáciles de encontrar, ya que el mismo Ide de Gambas te lo va a indicar.
Por ejemplo, si escribes mal alguna palabra que usa el lenguaje:




Fo a=1 to 10
print "valor a:",a
next


Aquí saltará un error en el ya que "FO", no lo entiende el interprete del Ide de Gambas.









-Errores del algoritmo que estamos intentando escribir
En las primeras faces de hacer un programa, habremos realizado algún esquema y/o añadido algún algoritmo para realizar las tareas... Una vez que lo pasamos a código, es posible que nos equivoquemos al traspasarlo, por ejemplo:

Este código intenta escribir del numero 1 al 100 en pantalla:




for a=1 to 100
print "valor a:",a
a=10
next



Pero no funciona bien, ya que crea un bucle infinito,  (nunca salimos de él) ya que con la sentencia a=10, el valor de "a" no llegará nunca a 100, y por lo tanto el bucle no termina.

Vemos claramente que el código esta bien escrito (no dará ningún error de sintaxis), pero  no funciona como deseamos ¿como "vigilar" el programa para saber que le esta pasando? pues poniendo un punto de interrupción, y ver como van tomando los valores las variables (en este caso "a").

Así tras ver varios ciclos, identificaremos fácilmente, que "a" no cambia de valor como debería...


No solo podemos ver lo que ocurre en bucles (for next, while wend, etc) , sino también  lo que ocurre a lo largo del programa, viendo como "salta" a las distintas subrutinas y funciones (lo que se llama la pila de llamadas del programa (http://es.wikipedia.org/wiki/Pila_de_llamadas), que valores estan tomando las variables  o incluso ver los controles "en modo de ejecución", que valores están tomando.


¿Como colocar un punto de interrupción que dependa de un valor de una variable?
Algunas veces, nos interesa (para ahorrar tiempo, por ejemplo), que el programa lo podamos "vigilar" cuando una variable halla tomado un determinado valor. Para ello podemos usar una condicional if...then .
Por ejemplo, en el ejemplo anterior, cuando queremos estudiar exactamente los que hace el programa cuando "a" valga  10






En el código anterior, he puesto un condicional para cuando a=10, y si os fijais , he puesto un punto de interrupción en la linea print "parada prevista".
De esta manera se ejecutará todo el bucle, hasta llegar el valor de a=10, entonces entraremos en modo depuración.

Quitar los puntos de interrupción que hayamos añadido al código:
Una vez que hayamos comprobado que el programa vaya bien, tendremos que quitar los puntos de interrupción. Existen dos formas de quitar los puntos:
1) Uno a uno
Nos situamos en la linea de código que tenga el punto de interrupción y pulsamos sobre el icono de punto de interrupción, quitándose el icono rojo que aparece en la linea de código, así quitaremos el punto de interrupción de la linea seleccionada.


2) Todos al mismo tiempo:
En el menú "Depurar" existe la opción de "Limpiar todos los puntos de interrupción", si la pulsamos automáticamente se quitaran todos los que hayamos insertado.





Perfilado: Optimizar del código.

Esta opción esta en el menu Depuración/Activar Perfilado (versiones de gambas3.4) :

 

Algunas veces nuestro programa resulta lento de ejecución, y para resolver este problema,  podemos optimizar su código. Evidentemente lo mejor sería averiguar que partes del programa consumen más recursos y tardan más tiempo, para centrarnos en ellos y optimizar su código. No tiene sentido dedicarnos a optimizar un trozo de código que apenas repercute en el tiempo que se ejecute el programa.

Necesitamos averiguar que partes del programa consumen más recursos y tardan más tiempos en ejecutarse: Para ello esta la opción del Perfilado.

 Esta opción permite ejecutar el programa y que cuando se termine de ejecutar, se genere un informe  muy detallado de que procesos (procedimientos, funciones, eventos) del programa han realizado tareas, consumidos recursos, ciclos realizados y tiempo que tardan...

Perfilado: Pestaña de métodos ejecutados
Perfilado: pestaña de "Ejecutado por..."


De ese modo podemos identificar los procesos "peores" o críticos, y dedicarles tiempo para optimizar su código.

Una vez realizado la optimización del código, podemos realizar otro perfilado, y compararlo con el anterior, para ver cual ha sido la mejora en el programa.

Ejercicio:
Os dejo aqui un código para que veis la diferencia. Tiene una parte repetida (un ciclo for ... next) que hace que se ejecute 40 veces el ciclo, cuando debería de ejecutarse solo 20 ciclos... Averigua con la herramienta perfilado donde cual es la función que esta mal y comprueba la mejora de tiempo de ejecución.

Descarga del código: Enlace







No hay comentarios:

Publicar un comentario

A falta de donativos... un poco de publicidad