Μεταγλώττιση - compiling

Για να μεταγλωτίσουμε ένα πρόγραμμα από πηγαίο κώδικα (source code) σε εκτελέσιμο ώστε να μπορούμε να το "τρέξουμε", χρησιμοποιούμε τον μεταγλωττιστή (compiler) gcc. Εάν ο πηγαίος κώδικας του προγράμματος μας βρίσκεται σε ένα αρχείο my_program.c τότε για να το μεταγλωτίσουμε δίνουμε την εντολή :
$> gcc my_program.c
Εάν το πρόγραμμά μας περιέχει συντακτικά λάθη -για παράδειγμα έχουμε ξεχάσει κάποια παρένθεση, κάποιο ερωτηματικό, ξεχάσαμε να δηλώσουμε μια μεταβλητή την οποία χρησιμοποιούμε στο πρόγραμμά μας κλπ- τότε ο compiler σταματάει τη μεταγλώτιση και μας τυπώνει ένα μήνυμα το οποίο υποδεικνύει τα συντακτικά λάθη του προγράμματος μας καθώς επίσης τη γραμμή στην οποία αυτά εμφανίζονται, έτσι ώστε ο προγραμματιστής να τα διορθώσει.

Συχνά, ένα συντακτικό λάθος οδηγεί τον compiler να θεωρήσει και άλλες εντολές του προγράμματος μας σαν λανθασμένες. Για αυτό το λόγο, όταν ο compiler μάς εμφανίζει πολλά συντακτικά λάθη στο πρόγραμμά μας, μια χρήσιμη τακτική είναι να κάνουμε τη διόρθωσή τους με τη σειρά που τα εμφανίζει ο compiler, καθώς κάποια συντακτικά λάθη που εμφανίζει ο compiler πιθανόν να μην είναι λάθη αλλά να οφείλονται σε προηγούμενα τα οποία οδήγησαν σε λανθασμένη μεταγλώτιση.

Όταν πλέον το πρόγραμμά μας δεν περιέχει συντακτικά λάθη τότε ο compiler δημιουργεί ένα εκτελέσιμο αρχείο που ονομάζεται a.out ("a.exe" στα Windows). Για να εκτελέσουμε αυτό το πρόγραμμα απλά γράφουμε το όνομά του στη γραμμή εντολών :
$> a.out

Για περισσότερες πληροφορίες για τις επιλογές που μπορείτε να χρησιμοποιήσετε με τον gcc μπορείτε να κάνετε man gcc στα εργαστήρια και να δείτε αναλυτικά το εγχειρίδιο του gcc.

Εκσφαλμάτωση - Debugging

Πολύ συχνά, παρόλο που το πρόγραμμά μας δεν έχει συντακτικά λάθη και εκτελείται κανονικά, δεν παράγει τα αποτελέσματα που περιμέναμε καθώς υπάρχει κάποιο λογικό λάθος στο πρόγραμμά μας. Τα λάθη αυτά είναι φυσικά πιο δύσκολο να βρεθούν από τα συντακτικά λάθη καθώς ο compiler δεν μπορεί να μας κάνει υποδείξεις τί να διορθώσουμε.

Για να διορθώσουμε τα λογικά λάθη σε ένα πρόγραμμά μας καταρχήν αυτό που χρειάζεται είναι να εξετάσουμε λεπτομερώς την αλληλουχία των εντολών και τη λογική του προγράμματος μας και να βεβαιωθούμε ότι ότι οι εντολές που γράφουμε στο πρόγραμμά μας όταν εκτελεστούν θα δώσουν το επιθυμητό αποτέλεσμα.

Ένα εργαλείο που μας βοηθάει πολύ για να βρούμε τα λογικά λάθη στα προγράμματά μας είναι ο gdb (gnu debugger). Για να μπορεί ο debugger να μας βοηθήσει πρέπει κατά τη μεταγλώτιση του προγράμματος μας να συμπεριλάβουμε την επιλογή -g δηλαδή να κάνουμε compile ως εξής :
$> gcc -g my_program.c
Με αυτό τον τρόπο ο compiler μαζί με τον εκτελέσιμο κώδικα παράγει επιπλέον πληροφορίες οι οποίες αργότερα θα βοηθήσουν τον debugger. Εάν δε συμπεριλάβουμε την επιλογή -g κατά το compiling τότε ο debugger δεν θα μπορεί να μας βοηθήσει.

Εκτέλεση - running

Για να τρέξουμε τον debugger γράφουμε :
$> gdb a.out
και ο debugger θα ξεκινήσει, εμφανίζοντάς μας μια γραμμή εντολών :
(gdb)
στην οποία μπορούμε να γράφουμε εντολές και να παρεμβαίνουμε στην εκτέλεση του προγράμματός μας ώστε να εξετάζουμε την ορθή λειτουργία του.

Παρακάτω εξετάζουμε μερικές από τις πιο βασικές εντολές του gdb. Για πλήρες εγχειρίδιο χρήσης μπορείτε να κάνετε man gdb ή να κοιτάξετε τη σελίδα http://www.gnu.org/manual/gdb-4.17/gdb.html.

core dumped

Πολλές φορές κάποιο λάθος στο πρόγραμμά μας προκαλεί ανώμαλο τερματισμό της εκτέλεσης, το οποίο συχνά συνοδεύεται από αποτύπωση της μνήμης του υπολογιστή όπως ήταν κατά τη διάρκεια της εκτέλεσης του προγράμματος ώστε να την εξετάσουμε και να δούμε τί πήγε στραβά. Το πρόγραμμα τυπώνει
segmentation fault (core dumped)
ή
bus error (core dumped)
και παράγει ένα αρχείο core το οποίο περιέχει την αποτύπωση της μνήμης όπως αναφέραμε.

Το αρχείο αυτό μπορούμε να το εξετάσουμε με τη βοήθεια του gdb ώστε να βρούμε σε ποιο ακριβώς σημείο του κώδικά μας προέκυψε το πρόβλημα που πρόκαλεσε το βίαιο τερματισμό της εκτέλεσης. Γράφουμε στη γραμμή εντολών :
$> gdb a.out core
και μέσα στο περιβάλλον του gdb δίνουμε την εντολή where. Με αυτή την εντολή ο debugger θα μας τυπώσει σε ποια γραμμή ακριβώς του προγράμματός μας προέκυψε το πρόβλημα. Απαραίτητη προυπόθεση για να μπορεί ο debugger να βρει και να μας τυπώσει την ακριβή γραμμή είναι το πρόγραμμά μας να έχει γίνει compile με την επιλογή -g (δες και παραπάνω στην παράγραφο Μεταγλώτιση - compiling).

χρήσιμα hints για τη χρήση του gdb


Η σελίδα αυτή συντάχθηκε από τον Γιώργο Ζαχαριουδάκη, κατά το χειμερινό εξάμηνο 2001-2002.

Κλείσιμο Παραθύρου