$ cd DIR/anno-mese-giorno_22Scrivete il file es1.s con il vostro editor preferito, oppure con emacs. Il comando per assemblare e collegare il primo esercizio è:
$ g++ -o es1 -fno-elide-constructors es1.s prova1.cppSe vengono prodotti molti errori, potete redirigere i messaggi su un file (ad es. errori) aggiungendo, nella bash, la redirezione 2> errori sulla riga del comando da eseguire. Potete quindi avviare il vi dicendogli di interpretare il file degli errori:
$ vi -q erroriin questo modo il vi si posizionerà sulla riga corrispondente al primo errore. Per passare all'errore successivo usare la sequenza di tasti :cn e, per tornare ad un errore precedente, la sequenza :cp. Quando avete corretto tutti gli errori otterrete l'eseguibile es1. Per controllare che sia corretto, scrivete:
$ ./es1e controllate che l'output sia identico al contenuto del file es1.out. Il controllo può essere anche eseguito automaticamente con il seguente comando, che stamperà solo le righe diverse (e quindi non stamperà niente se l'output e il contenuto del file coincidono):
$ ./es1 | diff - es1.outAggiungendo l'opzione -g al comando g++ verranno aggiunte le informazioni di debug negli eseguibili (per il debugger simbolico, ad es. gdb).
Se il vostro eseguibile viene terminato a causa di un accesso scorretto in memoria, può essere utile chiedere al sistema di generare il file core[2] corrispondente, in modo da ispezionare lo stato del processo al momento dell'errore. Molte distribuzioni Linux disabilitano la generazione dei file core, che può essere riabilitata con il seguente comando:
$ ulimit -c unlimitedA questo punto la shell dovrebbe informarvi della creazione del file, quando il vostro programma viene terminato, con un messaggio del genere ([1]):
Segmentation fault (core dumped)Il file core può essere ora esaminato con l'aiuto di gdb nel seguente modo:
$ gdb es1 coreIn molti casi si può così scoprire l'istruzione che ha causato l'errore, oltre a poter stampare il contenuto dei registri o esaminare la memoria (esempi).