PDF de programación - ANEXO 2 Herramientas de Depuración

Imágen de pdf ANEXO 2 Herramientas de Depuración

ANEXO 2 Herramientas de Depuracióngráfica de visualizaciones

Publicado el 17 de Julio del 2017
34 visualizaciones desde el 17 de Julio del 2017
1,1 MB
15 paginas
Creado hace 7a (28/04/2010)
Anexo Unidad 5

Introducción a las Herramientas de Desarrollo

Página 1/15

Universidad Nacional del Litoral

Facultad de Ingeniería y Ciencias Hídricas

Departamento de Informática



FUNDAMENTOS

DE PROGRAMACIÓN
Asignatura correspondiente al plan de estudios
de la carrera de Ingeniería Informática

ANEXO 2
Herramientas de Depuración

Ing. Pablo Novara - 21/04/2010

Anexo Unidad 5

Introducción a las Herramientas de Desarrollo

Página 2/15

Herramientas de Depuración

Herramientas a utilizar

La depuración, según las etapas de resolución de problemas planteadas al
comienzo de la asignatura, es el proceso de encontrar y corregir errores (de
lógica, no de sintaxis) en un programa. Existen herramientas que nos permiten
observar detalladamente como evolucionan los datos a medida que se avanza el
programa, y qué acciones son las que en verdad se ejecutan. Es decir, con estas
herramientas podemos pausar la ejecución en un punto dado, avanzar paso a
paso observando por qué lineas del código va pasando el control del programa,
observar cuanto valen determinadas variables en cada paso, etc1. La mayoría de
los IDEs actuales incluyen herramientas para la depuración. En esta guía se
utilizará el IDE ZinjaI para los ejemplos presentados, pero los conceptos
generales son aplicables también en cualquier otro entorno2.

Es importante destacar que más allá de la idea general que dicta que la
depuración sirve para encontrar y corregir errores; en muchos casos la
depuración será también de utilidad aún cuando el programa funcione
correctamente. Por ejemplo, cuando debemos comprender como funciona un
código escrito por otra persona. Con esta guía se busca fomentar el uso del
depurador como una herramienta didáctica y como un complemento
indispensable para el estudiante. Si bien en los primeros pasos, la falta de
experiencia con el lenguaje y el compilador puede causar confusión, una vez
dominadas las habilidades básicas de depuración se acortarán sensiblemente
los tiempos de desarrollo y se podrá aprovechar al máximo la capacidad del IDE.
Además, para proyectos de mayor tamaño (como el proyecto final de la
asignatura), en muchos casos resulta imposible realizar un seguimiento mental o
una prueba de escritorio debido a la complejidad del código y los múltiples
caminos de ejecución.

En esta guía se desarrollarán tres ejemplos prácticos ilustrando el manejo
básico de las facilidades de depuración. Cada ejemplo debería realizarse como
complemento a la práctica de una unidad de la asignatura. Es decir, el primer
ejemplo corresponde a la práctica de la unidad 7 (estructuras de control), el
segundo a la práctica de la unidad 8 (funciones), el tercero a la practica de las
unidades 9 (arreglos), y 10 (estructuras). Para evitar mayores confusiones, se
recomienda que no avance con ejemplos correspondientes a unidades que aún
no han sido dadas en las clases prácticas o teóricas, porque contienen códigos y
conceptos que tal vez no comprenda.

1 El tipo de depuración que se presentará aquí se puede catalogar como depuración a
nivel de código fuente, dado que el programador dispone del código fuente del
programa a depurar y controla el proceso utilizándolo como referencia. No es el único
tipo de depuración que existe, pero sí el más utilizado durante el desarrollo de un
software.

2 ZinjaI, funciona en realidad como una interfaz visual para gdb, el verdadero

depurador.

Anexo Unidad 5

Introducción a las Herramientas de Desarrollo

Página 3/15

Consideraciones Previas

En el proceso de compilación, el código fuente se traduce en código de
máquina. Sabemos que teniendo sólo el ejecutable (código de máquina) es
imposible recuperar el código fuente, pero aún teniendo ambos (ejecutable y
fuentes) no es trivial relacionar ambos códigos y saber por ejemplo, qué
dirección de memoria le asignó el sistema operativo a una variable, o qué
conjunto de instrucciones de máquina se corresponden a una linea de código. Es
por esto que para que la depuración desde el código fuente sea posible, el
compilador debe introducir dentro del ejecutable información adicional que le
permita establecer esta relación. Este ejecutable (llamado común mente versión
Debug), por lo tanto, será más grande, y eventualmente más lento3 que el
ejecutable final que el programador entregará al usuario una vez finalizado el
proceso de desarrollo (versión Release). Además, una vez compilado el
ejecutable en versión Debug, se debe recordar que si se modifican los fuentes,
se pierde la relación que existe entre éstos y el código de máquina del
ejecutable, y en este caso el depurador podría mostrar información incorrecta.

Otro detalle a tener en cuenta, es que para poder controlar correctamente un
programa, en muchos casos, el depurador debe encargarse de cargarlo y
ejecutarlo, por lo que el IDE presentará generalmente dos formas de ejecución:
la ejecución normal, y la ejecución para depuración (que será más lenta aún
para el mismo ejecutable).

3 La inclusión o no de la información de depuración no es la única diferencia entre las
compilaciones Debug y Release. Hay otras diferencias (como niveles de
optimización) que afectan de forma más perceptible la velocidad de ejecuación del
programa.

Anexo Unidad 5

Introducción a las Herramientas de Desarrollo

Página 4/15

Ejemplo Nro 1: Control básico e inspección de variables

Paso 0: El programa ejemplo

Para llevar a cabo este ejemplo utilizaremos el siguiente código:

#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {

unitbuf(cout);
int cant,n;
cout<<"Cantidad de datos: ";
cin>>cant;
double sum=0;
for (int i=0;i<cant;i++) {

cout<<"Ingrese el dato "<<i<<": ";
cin>>n;
sum+=n;

}
double prom = sum/cant;
cout<<"Promedio: "<<prom;
return 0;

}

Cree un nuevo archivo utilizando la plantilla predeterminada y copie el código

fuente del recuadro.

Este código corresponde a un programa que calcula y muestra el promedio de
n números (donde n es un dato ingresado también por el usuario). La variable
sum acumula (suma) todos los enteros ingresados, la variable cant contiene la
cantidad de enteros a ingresar, y finalmente, prom guardará el promedio
(sum/cant). Dentro del bucle, i es el contador, y n es una variable auxiliar para
leer los datos que se deben sumar en sum4.

Paso 1: Detener el programa

Para que podamos inspeccionar las variables, o controlar el avance del
programa, primero debemos hacer que se detenga en medio de la ejecución.
Para esto, antes de comenzar a ejecutarlo, debemos establecer “puntos de
interrupción” (breakpoints). Estos son puntos en el código (números de linea)
donde el depurador debe detener el programa. Por lo general, se indican con un
circulo rojo sobre el márgen izquierdo. Para colocarlo en ZinjaI, puede hacer
click sobre dicho márgen, o posicionar el cursor de texto en la linea de interés y
presionar F8.

4 La única linea podría desconocer es la que dice “unitbuf(cout);”. Esta linea se utiliza
para que cout muestre los mensajes en consola inmediatamente, ya que el
comportamiento normal es que espere a acumular varios mensajes y los muestre
todos juntos (a menos que reciba antes un endl). Este comportamiento podría
confundir a la hora de ejecutar paso por paso el programa.

Anexo Unidad 5

Introducción a las Herramientas de Desarrollo

Página 5/15

Pruebe colocar un punto de interrupción en la línea 10 (donde comienza el

bucle for).

Una vez colocado el punto de interrupción, ejecute el programa con la tecla
F5 (o la opción “Ejecutar” del menú “Depuración”). La ventana de ZinjaI
desplegará dos nuevos paneles: el panel de trazado inverso y el panel de
inspecciones. Inmediatamente, el programa comenzará a correr normalmente y
le solicitará que ingrese el primer dato.

Ingrese 5 y presione Enter. Observará que el programa se detiene luego de
leer el dato y la ventana de ZinjaI pasa al frente (o parpadea en la barra de
tareas). En el margen izquierdo del código encontrará una flecha verde sobre el
punto de interrupción. Esta flecha indica dónde se ha detenido el programa.
Cuando se marca una línea, quiere decir que el programa se detuvo justo antes
de ejecutar esa línea.

Anexo Unidad 5

Introducción a las Herramientas de Desarrollo

Página 6/15

Debe notar que no puede detener el programa en cualquier línea. Algunas,
como comentarios, declaraciones de variables o lineas en blanco, no tienen
correspondencia con ningún fragmento del ejecutable, por lo que no son puntos
de interrupción válidos. Si define un punto de interrupción en una posición
inválida, el depurador se detendrá en realidad en la siguiente posición válida.

Los puntos de interrupción, pueden tener una condición asociada, de forma
que el flujo del programa, si pasa varias veces por la misma línea, sólo se
detenga si se cumple dicha condición. Por ejemplo, para detenerse sólo en la
cuarta iteración del bucle, la condición sería i==3. Para definir una condición,
haga click sobre el punto de interrupción (en el margen) manteniendo presionada
la tecla Shift.

Existen otras dos formas de detener el programa sin colocar un punto de
interrupción: una es generar una señal (hay un botón de pausa en la barra de
herramientas de ZinjaI para GNU/Linux, o se puede forzar presionando Ctrl+C en
la consola de ejecución en Windows); la otra es generando un error (por
ejemplo, acceso a una posición de memoria inválida).

Paso 2: Inspeccionar variables

Una vez que se ha
  • Links de descarga
http://lwp-l.com/pdf5526  

Comentarios de: ANEXO 2 Herramientas de Depuración (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios