UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2015 - Enero 2016

Detección de fugas de memoria y depuración

Actividades en el laboratorio

1. Depurar un programa en C

Recursos

  • Carpeta Music_data en tu espacio compartido de Subversion. Tienes una copia local aquí.

Plan de trabajo

El programa my_music.c almacena información sobre una colección de discos tal y como se muestra en la siguiente figura.

Las variables globales rap, rock y rumba son estructuras de tipo Category con el número de discos y una lista encadenada de ellos. Cada disco es una estructura con el número de canciones, un array de información sobre cada canción y el puntero al siguiente disco. La información de una canción es su duración y un puntero al título.

El programa (ver función main) primero imprime el número de discos para cada categoría, luego la duración de todas las canciones de una categoría (mediante la función Duration), y finalmente el título de la última cación de cada disco en cada categoría mediante la función print_title_last_track_in_each_disk.

Puedes ignorar las funciones estáticas del fichero. Son correctas y lo único que hacen es cargar y descargar los datos en la estructura.

  1. Compila y ejecuta el programa my_music.c (recuerda compilarlo con la opción -g). Contiene tres errores. Debido a ellos, verás que los mensajes que imprime por pantalla son incorrectos. Por ejemplo, la duración de los discos de la categoría rap es incorrecta, y los mensajes que muestran el título de la última pista de cada disco son incorrectos.

  2. Utilizando el depurador, analiza la ejecución y arréglalos (igual es conveniente hacerte una copia del programa, para volver al fichero original si lo necesitas). Para ello, puedes localizar las tres variables globales y las dos funciones Duration y print_title_last_track_in_each_disk. Con el depurador vete hasta que se imprime la duración de la colección de rap y ejecuta paso a paso cómo se calcula. Repite el procedimiento para la primera llamada a la función print_title_last_track_in_each_disk.

    Recuerda que las funciones estáticas del fichero son correctas y lo único que hacen es cargar y descargar los datos en la estructura.

  3. La forma de saber si la ejecución es la correcta es porque la salida del programa debe ser (presta atención a la última línea):

    --- Welcome to the Music Statistics program ---
        Analyzing your music collection...
    
    2 disks in the rumba category
    2 disks in the rock category
    1 disks in the rap category
    
    Duration of rumba songs: 6019
    Duration of rock songs: 7044
    Duration of rap songs: 4639
    Duration of all songs: 17702
    
    Title of last track in rumba disks:
      Disk 1: vestido de flores
      Disk 2: nina
    
    Title of last track in rock disks:
      Disk 1: god save the queen
      Disk 2: now im here
    
    Title of last track in rap disks:
      Disk 1: curtains close skit
    
     --- PROGRAM IS FIXED! COMMIT YOUR CHANGES ---

Evaluación

Opcionalmente, sube el código al SVN y/o enséñaselo al profesor. Es conveniente que vayas apuntando los pasos para explicarle al profesor cómo has solucionado los errores y de qué manera te ha ayudado a hacerlo el depurador. El profesor además puede comprobar que has entendido el manejo del depurador con algunas preguntas.

¿Cuánto tiempo has dedicado a esta actividad? mins.

2. Detección de anomalías con Valgrind

Plan de trabajo

En esta actividad vamos a ejecutar ficheros que contienen errores de codificación en Valgrind. Estos ficheros se encuentran bajo el directorio Valgrind_errors en vuestro repositorio (con copia local aquí). Para cada uno de los ficheros siguientes, compila con la directiva -g (gcc -Wall -g tufichero.c -o tuejecutable), ejecútalo con Valgrind (valgrind --leak-check=yes ./tuejecutable) y corrige los errores aparecidos, explicando en el mismo fichero (una pequeña explicación de un par de líneas encerrada entre comentarios) qué error se estaba produciendo.

  1. Fichero strcpy_exercise.c: copia una cadena de caracteres en otra.

  2. Fichero printing_exercise.c: copia el valor de un entero a un puntero e imprime la dirección de dicho puntero y su valor recién copiado.

Evaluación

Optionally, subid los ficheros modificados mediante SVN y enséñaselos al profesor para que pueda evaluarlos.

¿Cuánto tiempo has dedicado a esta actividad? mins.

Uso de tablas de punteros

Recursos

Plan de trabajo

Partiendo del programa del menú para mostrar información de redes inalámbricas, realiza las siguientes modificaciones:

  1. Cambia la definición de la tabla que almacena las redes inalámbricas en la función main. Cada elemento de la tabla será un puntero a un dato de tipo struct ap_scan_info.

  2. Adapta las funciones del programa (array_load y demás) para que funcionen con el nuevo tipo de dato de la tabla.

Opcionalmente, sube el fichero al repositorio con svn commit.

¿Cuánto tiempo has dedicado a esta actividad? mins.

Ordenación y borrado

Plan de trabajo

Ahora es tiempo de que intentes mejorar la funcionalidad de tu menú Wifi con dos funciones especiales que harán más sencilla la aplicación diseñada:

  1. Función de [5] mostrar las mejores Wifis. Presentará las Wifis de forma ordenada, de tal manera que la de mejor energía aparecerá primero.

  2. Función de [6] borrado de Wifi. Esta marcará una Wifi como no disponible. Tras borrar la Wifi esta ya nunca volverá a aparecer.

¿Cuánto tiempo has dedicado a esta actividad? mins.