| prof.
Nunzio Brugaletta |
Sviluppo
in C++: strumenti in ambiente Linux |
|
|
Un programma durante l'intera fase del suo sviluppo, dal sorgente alla compilazione e generazione del file oggetto, al testing, può evidenziare errori e malfunzionamenti che possono essere, orientativamente, ricondotti a due categorie: |
Errori rilevati in fase di compilazione: si tratta degli errori rilevati dal compilatore e derivati da un uso errato delle parole chiavi o delle strutture sintattiche del linguaggio utilizzato per la scrittura del sorgente. Il compilatore, per vari motivi, non è in condizioni di generare il codice oggetto. Sono questi, tutto sommato, gli errori meno preoccupanti perché semplici da rintracciare e correggere: il compilatore fornisce una indicazione di massima sul tipo di errore commesso e sulla localizzazione della riga del sorgente dove è stato rilevato. Il messaggio di errore fornito può essere ambiguo e la riga indicata può essere anche la successiva a quella nella quale è localizzato effettivamente l'errore. Il compilatore genera l'errore quando non sa come tradurre una istruzione e questo può avvenire anche dopo la linea non corretta: in seguito all'errata interpretazione ci si aspetta qualcosa che, in effetti, non c'è e quindi l'errore viene individuato in quello che manca quando invece è quello che c'è che non va. In ogni caso, presa confidenza con i messaggi generati dal compilatore, è abbastanza agevole, in generale, risolvere l'errore.
Errori rilevati in fase di run-time: sono gli errori che si evidenziano quando si esegue il programma. I risultati prodotti non sono quelli attesi. Sono gli errori più insidiosi perché spesso difficili da rintracciare principalmente perché le uniche cose che il programmatore può controllare sono gli output, ma in realtà si tratta solamente dell'ultimo anello della catena: gli output sono semplicemente il risultato, visualizzato su schermo per esempio, di calcoli, che evidentemente sono errati in qualche punto, ma che non sono immediatamente controllabili.
Quello che è necessario per la correzione degli errori di run-time è avere a disposizione strumenti per il monitoraggio dell'esecuzione del programma, qualcosa che permetta, per esempio, di vedere dentro il computer gli effetti dell'esecuzione delle istruzioni. I debugger sono programmi che forniscono strumenti per il controllo dell'esecuzione di un programma. GDB è il debugger del progetto GNU di cui verranno esaminati i comandi di uso più comune e la sua interazione con l'ambiente Emacs.
Prima di entrare nello specifico di una sessione di debugging, è bene chiarire alcuni termini di uso comune.
Breakpoint: nelle sessioni di debugging si indica con questo termine il punto in cui si deve bloccare l'esecuzione del programma. Settare il breakpoint su una riga del programma comporta il blocco dell'esecuzione del programma immediatamente prima dell'esecuzione della riga.
Watchpoint: punti di osservazione delle variabili. Settare il watchpoint su una variabile o una espressione comporta il ricevere informazioni su come e quando varia il contenuto di una variabile o il valore dell'espressione.
Step: si tratta in questo caso di un modo di eseguire il programma un passo per volta. Ogni volta che vengono eseguite una o più istruzioni, a seconda del comando impartito al debugger, l'esecuzione del programma si blocca permettendo così di controllare le modifiche che la stessa ha apportato, per esempio, nei valori contenuti in una variabile.
| http://ennebi.solira.org |
ennebi@solira.org |