Una presentación de clase - Web del laboratorio del DIT

Anuncio
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
Descargar