• Non ci sono risultati.

• Peraccederealdebuggingsicompilacongcc-g-O0program.c • l’eseguibiledevepoterandareinmododapotersifermareincorrispondenzaadognirigadelsorgente; • l’eseguibiledevecontenereleinformazionisulsorgente; • ipi`ubravipossonoguardareilcontenutodeiregistri; • sipo

N/A
N/A
Protected

Academic year: 2021

Condividi "• Peraccederealdebuggingsicompilacongcc-g-O0program.c • l’eseguibiledevepoterandareinmododapotersifermareincorrispondenzaadognirigadelsorgente; • l’eseguibiledevecontenereleinformazionisulsorgente; • ipi`ubravipossonoguardareilcontenutodeiregistri; • sipo"

Copied!
8
0
0

Testo completo

(1)

Debugging

Se un programma compila non `e detto che funzioni

se un programma funziona non `e detto che faccia quello che avete in mente;

se un programma pu`o essere eseguito, an- che terminando prematuramente, si pu`o u- sare un debugger;

si possono monitorare le variabili e vedere il contenuto degli array;

i pi`u bravi possono guardare il contenuto dei registri;

l’eseguibile deve contenere le informazioni sul sorgente;

l’eseguibile deve poter andare in modo da potersi fermare in corrispondenza ad ogni riga del sorgente;

Per accedere al debugging si compila con gcc -g -O0 program.c

(2)

Metodi tradizionali

Un sitema semplice `e quello di stampare il va- lore di una variabile (o anche solo il numero di linea) in vari punti del programma con

printf(“formato”,variabile);

Il tutto si pu`o rendere pi`u sistematico definendo la macro TRACE

#define TRACE {printf(“ LINE ”);}

`e come dire “sono arrivato fin qui”

l’istruzione per`o non viene eseguita subito

si pu`o forzare l’istruzione con fflush(stdout)

Definisco allora meglio

#define TRACE {printf(“ LINE ”); fflush(stdout);} Si tratta comunque di metodi piuttosto rudi-

mentali

(3)

Data Display Debugger ddd

Scegliere File → Open Program e selezionare l’eseguibile;

compare una finestra con il sorgente (Source Window) ed un’altra con i comandi del de- bugger (Gdb Window);

Run fa andare il programma dall’inizio alla fine;

il programma si ferma ai breakpoint;

Step va alla prossima linea del programma entrando in ogni funzione;

Next fa lo stesso ma non entra nelle fun- zioni;

Finish esce dalla funzione dove siete;

Cont continua fino alla fine o fino al prossimo breakpoint;

Until va alla linea del sorgente che sta pi`u in basso di quella attuale (utile per uscire dai cicli)

(4)

Vedere le variabili

Le variabili sono mostrate in un’appostita finestra (Data Window)

Scegliere Data → Display Local Variables;

puntare il mouse su di una variabile e te- nercelo ne mostra il valore;

facendo click col tasto destro del mouse su di una variabile si pu`o vederne il valore in permanenza in una finestra scegliendo display variabile;

nella finestra del debugger sotto al sor- gente scrivere l’istruzione p(rint) i oppure p(rint) a[20] etc.

per vedere vari elementi dell’array v bisogna invece portarsi nella finestra di Gdb e scri- vere, ad esempio graph display v[11..21]

per vedere gli elementi che vanno da 11 a 21;

(5)

Profiling

Serve a misurare la velocit`a di esecuzione delle singole funzioni del programma;

si deve compilare in questo modo gcc -pg sorgente.c

il programma deve essere poi eseguito e quindi si pu`o dare il comando

gprof [-b] eseguibile ( | less)

si ottiene una statistica del tempo speso in ogni funzione, e il numero di volte che ogni funzione `e stata chiamata;

(6)

il profiler non corregge i programmi, serve solo a renderli pi`u veloci;

guardare in quali funzioni un programma passa pi`u tempo;

concentrarsi su quelle chiamate pi`u volte:

anche un piccolo guadagno di tempo verr`a moltiplicato per un fattore grande;

`e sempre buona norma avere inizialmente un programma funzionante che produca risul- tati esatti; in seguito ogni modifica deve portare a risultati compatibili.

(7)

Output di gprof

La parte importante dell’output di gprof `e co- stituita dalla prima tabella: nelle colonne ci sono, nell’ordine:

Percentuale di tempo impiegato da una fun- zione;

tempo totale impiegato, comprese le chia- mate a sottofunzioni;

tempo totale, senza le chiamate a sotto- funzioni;

numero di volte che la funzione `e stata chiamata;

tempo impiegato per ogni chiamata, senza chiamate alle sottofunzioni;

tempo totale impiegato, incluse le chia- mate a sottofunzioni.

(8)

Valgrind

Valgrind `e un programma che permette di ve- rificare il corretto uso della memoria da parte di un programma

pu`o segnalare errori di accesso agli array dinamici: ad esempio, se abbiamo allocato 100 posti per numeri in doppia precisione per double a e poi cerchiamo di accedere ad a[100] facciamo un errore che il compi- latore di solito non rivela;

devo compilare il programma da correggere con le opzioni di debugging, e cio`e -g -O0

nell’ eseguire il programma a.out lancio il programma valgrind a.out e questo mi se- gnaler`a accessi scorretti alla memoria.

posso usare valgrind anche per studiare gli accessi alla cache cercando di migliorare i tempi di esecuzione. In questo caso il co- mando da usare `e valgrind –tool=cachegrind a.out

Riferimenti

Documenti correlati

Corso di laurea in Geologia Istituzioni di matematiche.

Questo flusso ` e somma algebrica del flusso attraverso la superficie Σ e del flusso attraverso la superficie E, che sono quindi uguali in valore assoluto. Possiamo pertanto

Stesso contesto

• se il numero di round è pari a 2, qualsiasi rete di Feistel non può essere considerata una permutazione pseudocasuale:. • ogni rete di Feistel con numero di round pari a 3 non è

Si innesca un ‘ciclo’ di attivazioni, non esplicitamente realizzato con strutture cicliche, dovuto alle susseguenti attivazioni che il sottoprogramma fa a se stesso (se

• Dividere il gruppo rimasto in tre sottogruppi e applicare di nuovo il procedimento finché i sottogruppi contengano una sola pallina: l’ultima pesata indicherà quale delle

[r]

La verifica di questo fatto `e immediata usando l’asso- ciativit`a del prodotto tra matrici, l’importante `e che si usi sempre la stessa base di W sia per la f che per la g..