Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio15:esercitazionia:esercitazione2

Esercitazione 2

Ancora esercizi su C e su libreria standard di IO. Tools: mtrace e valgrind.

Cercare di completare tutti gli esercizi durante le ore di laboratorio e nel caso come homework.

Esercizio 0: esperienza su preprocessing, compilazione e linking

Seguire l'esempio dei lucidi di proprocessing, compilazione e linking verificando i vari passi con i comandi nm, objdump o readelf ed ldd.
Vedere i manuali in linea dei comandi.

Esercizio 1: utilizzo di mtrace

Verificare gli accessi in memoria compiuti dalle funzioni scritte per l'esercizio n. 7 dell'Assegnamento1 (costruzione di binaryTree) 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
  • includere l'header mcheck.h
  • 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 muntrace() alla fine della parte del programma C che vogliamo verificare
  • compilare il file da verificare con opzione -g per includere le informazioni di debugging.
  • settare la variabile di ambiente MALLOC_TRACE al path del file in cui vogliamo che la mtrace() 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 il programma
  • dopo l'esecuzione nel file ./mtrace.out sono registrati gli accessi in formato testuale non facilmente comprensibile. Interpretarlo utilizzando l'utility mtrace, ad esempio:
bash$ mtrace ./myprog ${MALLOC_TRACE} 

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 con valgrind

Verificare la correttezza degli accessi in memoria degli esercizi dell'Assegnamento1 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 o a zone non inizializzate.

Per fare questo procedere come segue:

  • compilare il file da verificare con opzione -g per includere le informazioni di debugging.
  • eseguire il programma con valgrind :
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.

Esercizio 3

Scrivere un programma che implementa l'equivalente del comando Unix cat senza opzioni (mycat file1 [file2 …] ).

Esercizio 4

Scrivere un programma che prende in ingresso un intero (piccolo, es. <=512), alloca in memoria una matrice di 512×512 elementi float in modo che siano contigui in memoria. Inizializzare tale matrice (M) in modo arbitrario (ad esempio M(i,j) = (i+j)/2.0). Fare quindi il dump della matrice in formato binario su un file il cui nome è 'mat_dump.dat'. Rileggere quindi la matrice dal file 'mat_dump.dat' memorizzandola in una matrice differente da quella di partenza (M2). Al termine dell'operazione effettuare il confronto delle due matrici con la funzione di libreria memcmp.

Esercizio 5

Scrivere un programma che prende in ingresso come parametro un nome di un file (ad esempio input.txt). Il file è un file testuale che contiene un certo numero di righe. Leggere tutte le righe del file e costruire un'unica stringa in memoria data dalla concatenazione di ogni striga del file tra loro separate da uno spazio. Scrivere la stringa cosi ottenuta in un file che ha lo stesso nome del file in input ma con estensione “.log” (per il nostro esempio il nome sarà quindi input.log).

Esercizio 6

Realizzare l'esercizio 7 (dell'Assegnamento1) che costruisce un albero binario di ricerca da un array di N elementi con le seguenti modifiche/estensioni:

  • gli elementi dell'array devono essere letti da un file testuale; il file contiene un certo numero di righe ognuna del formato [+|-]numero-intero.
  • le funzioni 'buildTree' 'printInOrder' 'getMin' 'getMax' 'deleteTree' devono essere implementate in un file separato rispetto al file contenente il main (le definizioni in un file '.h' e l'implementazione in un file '.c').

Creare il codice oggetto dei due file '.c' e linkarli insieme in un unico file eseguibile.

Un possibile file di input è il seguente:
-1
2
+3
0
120

Esercizio 7

Scrivere un programma che realizzi l'equivalente del comando Unix wc limitatamente alle opzioni -l e -w (man 1 wc). L'opzione -l restituisce il numero di linee del file, l'opzione -w restituisce il numero di parole nel file. Se non vengono passate opzioni, il programma stampa sia il numero di linee che il numero di parole del/dei file i cui nomi sono passati come argomento (mywc [-l -w] file1 [file2 file3 ….]).

informatica/sol/laboratorio15/esercitazionia/esercitazione2.txt · Ultima modifica: 17/03/2015 alle 05:44 (9 anni fa) da Massimo Torquati