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
-g
per includere le informazioni di debugging. Ad esempio se il mio file si chiamamain.c
posso compilare con
bash$ gcc -Wall -pedantic -g -o prova main.c
- settare la variabile di ambiente
MALLOC_TRACE
al 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.out
devo usare il comando
bash$ export MALLOC_TRACE=./mtrace.out
- eseguire, nel nostro esempio con:
bash$ ./prova
- dopo l'esecuzione nel file
./mtrace.out
sono 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
-g
per includere le informazioni di debugging. Ad esempio se il mio file si chiamamain.c
posso 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.