Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 1
FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria Università degli Studi di Udine
Linguaggio C Debugging
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio, musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine.
Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero dell’Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di lucro. In tal caso non è richiesta alcuna autorizzazione.
Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.
L’informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di queste slide (ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento dell’informazione).
In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste slide.
In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.
Nota di Copyright
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 3
Debugging
• Ogni programma, a qualunque livello di complessità, è soggetto ad errori di programmazione (“bug”)
• Gli errori lessicali e sintattici vengono rilevati da parte del compilatore, che fornisce all’utente dei messaggi contenenti il numero di riga e il tipo di errore trovato nel sorgente
• Alle volte i messaggi possono recare solo degli avvertimenti (“warning”), senza bloccare la compilazione: in tale caso è bene rivedere la correttezza semantica delle istruzioni
• Un programma compilato senza “warning” non garantisce affatto l’assenza di errori!
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 4
Debugging
• Gli errori di traduzione di un algoritmo nelle corrispondenti istruzioni in linguaggio C sono spesso difficili da individuare
• È sempre consigliabile:
– verificare la corrispondenza dell’algoritmo con le specifiche richieste al programma
– effettuare un’analisi ragionata del codice “sulla carta”, ripercorrendo mentalmente tutti i passi di programma – esaminare le espressioni, specialmente quelle di controllo
nei cicli iterativi
– controllare l’effettiva allocazione delle variabili e tutte le operazioni di assegnamento
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 5
Debugging
• La compilazione condizionale offre un supporto molto semplice da usare in fase di debugging
#define DEBUG
… int i = 0;
#ifdef DEBUG
printf ("Inizio ciclo while...\n");
#endif
while (i < 100);
{
#ifdef DEBUG
printf ("i vale %d\n", i);
#endif
printf ("Messaggio ripetuto 100 volte\n");
}
Il programma si ferma alla stampa del primo messaggio
→qualcosa non va...
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 6
Debugging
• La compilazione condizionale può essere applicata alla stampa dei valori delle variabili “critiche”
• Questa tecnica aiuta il programmatore a visualizzare i risultati degli step più complessi
• Quando si deve analizzare l’esecuzione dei cicli, è consigliabile stampare i valori delle variabili usate come contatori → utile nel caso di operazioni sui vettori!
int a[10];
...
for (i = 1; i < 10; i++) {
if (a[i] < 0) continue;
printf ("%d\n", a[i]);
}
Non stamperà mai il valore di a[0], primo elemento del vettore!
Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni 2 (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 7
Debugging
• Un modo per individuare il “bug” precedente può essere:
#define DEBUG ...
int a[10];
...
for (i = 1; i < 10; i++) {
#ifdef DEBUG
printf (“Ora leggo a[%d]\n”, i);
#endif if (a[i] < 0)
continue;
printf ("%d\n", a[i]);
}
Ecco l’errore! Ho sbagliato l’inizializzazione del contatore nel ciclo for!
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 8
Debugger
• Gli ambienti di sviluppo integrati per il linguaggio C offrono spesso degli strumenti software per il debugging (debugger)
• Compilando i sorgenti in modo opportuno, è possibile introdurre delle istruzioni specifiche per il debugger
• Esse consentono il blocco dell’esecuzione ad ogni step e la visualizzazione a runtime dei valori di alcune o tutte le variabili
• È tuttavia consigliabile impiegare il debugger solo nel caso di programmi molto complessi e difficilmente analizzabili “a occhio nudo”
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 9
Debugger in ambiente GCC
• Compilazione per il debugger:
C:\PROGR> gcc -g -o nome.exe nome.c
• Esecuzione con debugger grafico:
C:\PROGR> insight nome
Fondamenti di Informatica - Linguaggio C - Debugging
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 10