MasterDrive.it   
Vai indietro   MasterDrive.it > Software Development > C/C++ > C/C++ Tutorials & How-To



Rispondi
 
Strumenti della discussione Modalità di visualizzazione
Vecchio 02-08-2008, 14:12   #1 (permalink)
Neofita della community

 L'avatar di Mauro_L
 
56 Messaggi

Mauro_L novizio della comunita' ( + 10 )
GCC: Compilazione e Debug da console

Articolo originale qui.



Quello che presento ora è uno stile di lavoro che consente di compilare ed eseguire velocemente i programmi, effettuando anche l'operazione di debug attraverso l'utilizzo della console.
A seconda di quale distribuzione Linux utilizziate avrete installato sicuramente un buon editor di testo (su KDE io uso Kate) con il quale scrivere il sorgente del vostro programma e salvarlo con estensione .c .

Compilazione

Per il processo di compilazione del sorgente utilizziamo il compilatore gcc che risiede installato di default su ogni distribuzione che si rispetti.
Apriamo una console e con il comando cd raggiungiamo la cartella dove risiede il sorgente.

Per esempio: se il sorgente è in /home/utente/progetti/programma.c occorrerà digitare in console:
codice:
[utente@nomepc]~ cd /home/utente/progetti
Per la compilazione ora digitiamo:
codice:
[utente@nomepc progetti] gcc programma.c
In questo modo, se non vi sono errori nel codice, viene creato il file a.out eseguibile. Per dare un nome diverso all'eseguibile occorre aggiungere un parametro opzionale al comando di compilazione che diventa:
codice:
[utente@nomepc progetti] gcc programma.c -o exeprog
Dove con exeprog indichiamo come si dovrà chiamare l'eseguibile creato. Un ulteriore opzione che fa stampare tutti i Warning di compilazione e aiuta a scovare errori altrimenti difficili da individuare è -Wall. Se si vuole fare il debug del programma occorre aggiungere anche il parametro -g.
In conclusione il comando di compilazione più completo è:
codice:
[utente@nomepc progetti] gcc programma.c -o exeprog -Wall -g
Esecuzione

Per eseguire un programma occorre digitare, in console, il comando:
codice:
[utente@nomepc progetti] ./exeprog
oppure
codice:
[utente@nomepc progetti] ./a.out
Debug

Il programma utilizzato per il debug è il celeberrimo gdb che è alla base del 90% dei debugger grafici.
Se non è installato sul nostro sistema dovremo installarlo (esistono sicuramente dei pacchetti adatti a qualsiasi distribuzione). Per lanciare il debug di un eseguibile (compilato con l'opzione -g) dobbiamo digitare in console:
codice:
[utente@nomepc progetti] gdb exeprog
Comparirà un nuovo prompt:
codice:
(gdb)
Ecco riassunti i comandi principali:
  • l
Visualizza sorgente a partire dall’ultima riga visualizzata oppure dal numero di riga n
codice:
l <n>
  • b
Imposta un breakpoint ad una certa riga n
codice:
b n
  • r
Esegue il programma, fa partire il debug
codice:
r [eventuali parametri]
  • s
Step (entra anche nelle funzioni)
  • n
Next (non entra nelle funzioni)
  • p
Visualizza il contenuto di una variabile
codice:
p variabile
p *puntatore
p struttura->campo
p vettore@num_elementi
  • d
Come p, ma visualizza automaticamente le variabili ad ogni step (usarla con molta moderazione
  • c
Riprende l’esecuzione dopo un breakpoint
  • k
Uccide (kill) l’esecuzione del programma
  • q
Chiude gdb

Esempio

codice:
(gdb) l 30
  25    FILE *fp;
  26
  27    if(argc != 4){
  28        help();
  29        exit(0);
  30    }
  31    fp = aprifile(argv[1], “rt”);
  32    h1 = leggifile(fp);
  33    fclose(fp);
  34    fp = aprifile(argv[2], “rt”);
(gdb) b 31
Breakpoint 1 at 0×8048671: file SimEsame.c, line 31.
(gdb) r input1.txt input2.txt output.txt
Starting program: SimEsame input1.txt input2.txt output.txt
 
Breakpoint 1, main (argc=4, argv=0xbfe10) at SimEsame.c:31
31              fp = aprifile(argv[1], “rt”);
(gdb) n
32              h1 = leggifile(fp);
(gdb) n
33              fclose(fp);
(gdb) n
34              fp = aprifile(argv[2], “rt”);
(gdb) n
35              h2 = leggifile(fp);
(gdb) n
36              fclose(fp);
(gdb) n
37              h3 = unisci(h1, h2);
(gdb) p h2
$1 = (nome *) 0×804a300
(gdb) p *h2
$2 = {s = 0×804a310 “Andrea”, next = 0×804a320}
(gdb) p h2->next
$3 = (struct tnome *) 0×804a320
(gdb) p *h2->next
$4 = {s = 0×804a330 “Attilio”, next = 0×804a340}
(gdb) c
Continuing.
 
Program exited normally.
(gdb)q
Alla prossima

__________________
Mauro

The best thing about a boolean is even if you are wrong, you are only off by a bit.(Anonymous)
Mauro_L non è in linea   Bookmark and Share Rispondi quotando
Rispondi

Strumenti della discussione
Modalità di visualizzazione

Regole d'invio
Non puoi inserire discussioni
Non puoi inserire repliche
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è attivo
Le smilies sono attive
Il codice IMG è attivo
il codice HTML è disattivato
Trackbacks are attivo
Pingbacks are attivo
Refbacks are disattivato

Salto del forum


Tutti gli orari sono GMT +1. Attualmente sono le 21:50.


Powered by vBulletin versione 3.8.0
Copyright © 2000 - 2010, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.2.0

Valid XHTML 1.0 Transitional  Creative Commons License

Eccetto dove diversamente specificato, i contenuti pubblicati in questa comunità sono rilasciati sotto Licenza
Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia License.
La comunita' di MasterDrive.it non e' responsabile di eventuali imprecisioni presenti nelle pagine.