Laboratorio de Programación Descubrimiento y reparación de errores (debugging) Dpto. de Ingeniería de Sistemas Telemáticos http://www.lab.dit.upm.es/~lprg/ Febrero 2003 Puesta a punto fallo serio desarrollo falla pruebas pasa pruebas de aceptación detalle falla ¿dónde falla qué? • trazas • aserciones pasa Febrero 2003 presentación 2 1 Trazas (logging) z Primera aproximación System.err.println("Estoy aquí"); System.err.println("variable= " + variable); z Problema aparecen multitud de trazas que cuesta saber de dónde proceden hay que indicar dónde se produce la traza Febrero 2003 presentación 3 Trazas (logging) z Segunda aproximación System.err.println ("paquete.clase.método: Estoy aquí"); System.err.println ("paquete.clase.método.variable= " + variable); z Problema ensucian la salida: deberíamos quitar la traza cuando el programa funcione Febrero 2003 presentación 4 2 Trazas (logging) z Tercera aproximación static boolean traza= false; if (traza) System.err.println("paquete.clase.método: Estoy aquí"); if (traza) System.err.println("paquete.clase.método.variable= " + variable); z Problema todo o nada: puede interesar controlar el nivel de detalle Febrero 2003 presentación 5 Trazas (logging) z Cuarta aproximación static int detalle= 0; if (detalle >= x) System.err.println("paquete.clase.método: Estoy aquí"); if (detalle >= y) System.err.println("paquete.clase.método.variable= " + variable); z Problema la traza aparece por consola: oscurece el resultado normal se pierde Febrero 2003 presentación 6 3 Trazas (logging) z Quinta aproximación static int detalle= 0; static PrintStream log= null; if (detalle >= x) log.println("paquete.clase.método: Estoy aquí"); if (detalle >= y) log.println("paquete.clase.método.variable= " + variable); log= new PrintStream(new FileOutputStream(“traza”); z Problema hay que compilar el programa para cada cambio ver java.util.logging Febrero 2003 presentación 7 Nivel de detalle 1000 TODO 700 600 500 400 300 200 100 0 Febrero 2003 MÁXIMO DETALLE MÁS DETALLE DETALLE CONFIGURACIÓN INFORMATIVO PELIGRO FATAL NADA presentación 8 4 Ejemplo z Algoritmo para hallar raices de funciones x tal que f(x)=0 f(x) min Febrero 2003 m1 presentación m2 max x 9 Programa double raiz (double min, double max) { double y1= eval(min); double y2= eval(max); if (Math.abs(y1) < error) return min; if (Math.abs(y2) < error) return max; for (int i= 0; i < 1000; i++) { double m= (min+max)/2; double ym= eval(m); if (Math.abs(ym) < error) return m; if (y1*ym < 0) max= m; else min= m; } throw new Error(“RaizCuadrada.raiz”); } Febrero 2003 presentación 10 5 Instrumentación // niveles de static final static final static final static final static final static final static final static final static final detalle en las trazas int TODO= 1000; int MAXIMO_DETALLE= 700; int MAS_DETALLE= 600; int DETALLE= 500; int CONFIGURACION= 400; int INFORMATIVO= 300; int PELIGRO= 200; int FATAL= 100; int NADA= 0; // nivel efectivo de detalle static int detalle= NADA; Febrero 2003 presentación 11 Programa trazado double raiz (double min, double max) { if (detalle >= INFORMATIVO) log.println(“RaizCuadrada.raiz(" + min + ", " + max + ")"); double y1= eval(min); double y2= eval(max); if (detalle >= MAXIMO_DETALLE) { log.println("RaizCuadrada.raiz.y1= " + y1); log.println("RaizCuadrada.raiz.y2= " + y2); } if (Math.abs(y1) < error) return min; if (Math.abs(y2) < error) return max; for (int i= 0; i < 1000; i++) { if (detalle >= DETALLE) { log.println("RaizCuadrada.raiz.min= " + min); log.println("RaizCuadrada.raiz.max= " + max); } ... ... ... Febrero 2003 presentación 12 6 Aserciones z Suposiciones del programador que deben cumplirse y, si no se cumple, más vale parar inmediatamente SIEMPRE if (! condicion) { System.err.println("paquete.clase.metodo: " + "no se cumple la condicion"); System.exit(1); } Febrero 2003 presentación 13 Programa ... ... ... double rango= max-min; for (int i= 0; i < 1000; i++) { if (min > max) { System.err.println("RaizCuadrada.raiz: min > max"); System.exit(1); } if (rango < (max-min)) { System.err.println("RaizCuadrada.raiz: diverge"); System.exit(1); } rango= max-min; ... ... ... Febrero 2003 presentación 14 7 Conclusiones z Cuando un programa no funciona las aserciones indican qué falla las trazas descubren cómo se llega al fallo z Trazas y aserciones son inversiones de futuro deben quedar en el código para siempre z Conviene controlar el detalle de trazado z Apuntes http://www.lab.dit.upm.es/~lprg /clases/debugging/debugging.htm Febrero 2003 presentación 15 8