Questa è una vecchia versione del documento!
Esercitazione 2
Dove si sperimanta qualche tool e si approfondiscono alcune caratteristiche del C sequenziale: errno, perror …
Esercizio 1: mtrace
Verificare gli accessi in memoria compiuti dalle funzioni su liste di interi della libreria libList.a utilizzando la funzione mtrace e l'utility mtrace, questi strumenti tracciano le azioni di allocazione e deallocazione di memoria compiute dal programma per verificare la presenza di memory leak cioe' memoria non deallocata.
Per fare questo procedere come segue:
- leggere le informazioni in
man 3 mtrace - inserire la chiamata alla funzione di libreria mtrace() all'inizio della parte del programma C che vogliamo verificare
- inserire la chiamata alla funzione di libreria unmtrace() alla fine della parte del programma C che vogliamo verificare
- compilare il file da verificare con opzione
-gper includere le informazioni di debugging. Ad esempio se il mio file si chiamamain.cposso compilare con
bash$ gcc -Wall -pedantic -g -o prova main.c
- settare la variabile di ambiente
MALLOC_TRACEal path del file in cui vogliamo che lamtrace()registri le informazioni sugli accessi di memoria. Ad esempio se voglio registrare le informazioni nel file./mtrace.outdevo usare il comando
bash$ export MALLOC_TRACE=./mtrace.out
- eseguire, nel nostro esempio con:
bash$ ./prova
- dopo l'esecuzione nel file
./mtrace.outsono registrati gli accessi in formato testuale non facilmente comprensibile. Interpretarlo con l'utility mtrace. Ad esempio sempre riferendosi al nostro esempio invocare
bash$ mtrace ./prova ./mtrace.out
questo rispondera' No memory leaks se tutta la memoria e' stata deallocata o fornira' indicazioni su dove e' stata allocata la mamoria rimasta da deallocare.
Esercizio 2: verificare gli accessi in memoria: valgrind
Verificare la correttezza degli accessi ai puntatori compiuti dalle funzioni su liste di interi della libreria libList.a utilizzando valgrind.
Questo strumento permette fra l'altro di capire se tutte le variabili sono inizializzate prima del loro uso, se accediamo a memoria gia' deallocata o mai allocata e situazioni similari
Per fare questo procedere come segue:
- compilare il file da verificare con opzione
-gper includere le informazioni di debugging. Ad esempio se il mio file si chiamamain.cposso compilare con
bash$ gcc -Wall -pedantic -g -o prova main.c
- eseguire
bash$ valgrind ./prova
in questo modo, a schermo verranno riportare le infrazioni rilevate. Ad esempio, invalid read o invalid write sono accessi in lettura o scrittura a memoria non allocata o gia' deallocata.
