2.7 Αποσφαλμάτωση
© Γιάννης Κωστάρας
<- | Δ | -> |
Η λέξη “Bug” (ή σφάλμα στην ελληνική του απόδοση) προέρχεται από τη ναύαρχο Grace Hopper το 1947 καθώς εργαζόταν σε έναν Η/Υ τύπου Mark II στο Harvard. Η δυσλειτουργία του προγράμματος οφειλόταν σ’ ένα ζωύφιο (bug) που είχε κολλήσει σ’ ένα κύκλωμα, οπότε η διαδικασία αποκόλλησής του ονομάστηκε debugging. (Wikipedia)
Υπάρχουν πολλών ειδών bugs που θα αντιμετωπίσετε στη Java:
- Λάθη μεταγλώττισης (compile-time errors): λάθη που τα βρίσκει ο μεταγλωττιστής, π.χ. συντακτικά λάθη (λείπει ένα ; ή μια παρένθεση ()) ) ή λάθη τύπων δεδομένων π.χ. μη δήλωση τύπου μιας μεταβλητής, εκχώριση τιμής σε λάθος τύπο δεδομένων κλπ.
- Λάθη εκτέλεσης (run-time errors): λάθη που τα βρίσκετε κατά την εκτέλεση του προγράμματος, π.χ. διαίρεση με το μηδέν, άνοιγμα ενός αρχείου που δεν υπάρχει κλπ.
- Λογικά λάθη (logic errors): λάθη που τα βρίσκει είτε ο προγραμματιστής είτε ο ελεγκτής (tester) του προγράμματος τα οποία είναι είτε λάθος αποτελέσματα είτε λαθεμένη συμπεριφορά του προγράμματος και είναι τα πιο δύσκολα να επιλυθούν. Λέγεται, ότι ένας προγραμματιστής ξοδεύει το 75% του χρόνου του στην επίλυση τέτοιων λαθών.
Για την αντιμετώπιση των λογικών λαθών (αλλά και των λαθών εκτέλεσης), μπορείτε να χρησιμοποιήσετε την τεχνική της αποσφαλμάτωσης ή εκσφαλμάτωσης (debugging). «Αποσφαλμάτωση» ή «εκσφαλμάτωση» (debugging) ονομάζεται η μεθοδική διαδικασία εύρεσης και εξάλειψης σφαλμάτων κώδικα ενός προγράμματος υπολογιστή ώστε να συμπεριφέρεται όπως προβλέπεται.
Διαδικασία:
- Πίστεψε ότι το πρόβλημα μπορεί να λυθεί και επέμενε μέχρι τη λύση του
- Επανάληψη/επιβεβαίωση του προβλήματος (αν το πρόβλημα είναι αναπαραγώσιμο)
- Απομόνωση του σημείου που εμφανίζεται το σφάλμα (συνήθως από τα αρχεία καταγραφής – logs)
- Αναγνώριση της αιτίας που το προκαλεί
- Διόρθωση του σφάλματος
- Επιβεβαίωση της διόρθωσης
Με τη βοήθεια ενός αποσφαλματωτή (debugger), ωθούμε το πρόγραμμα ώστε να εισέλθει σε μια συγκεκριμένη κατάσταση ώστε να εμφανιστεί το πρόβλημα.
Το NetBeans περιλαμβάνει έναν visual debugger που διευκολύνει τη διαδικασία.
Αποσφαλμάτωση με το NetBeans
Δημιουργήστε ένα νέο έργο (project) με όνομα Debug
στο NetBeans όπως μάθαμε στο πρώτο μάθημα αυτής της εβδομάδας.
Επικολλήστε τον παρακάτω κώδικα μέσα στη μέθοδο main()
:
public static void main(String[] args) {
int[] ints = {1, 2, 3, 4, 5};
for (int i = 0; i <= ints.length; i++) {
System.out.println(ints[i]*ints[i]);
}
}
Εκτελώντας το πρόγραμμα βλέπουμε το παρακάτω αποτέλεσμα (μενού Window --> Output
):
1
4
9
16
25
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
Αν και το πρόγραμμα υπολογίζει σωστά τα τετράγωνα των 5 αριθμών (1-5), στο τέλος εγείρει μια εξαίρεση εκτέλεσης που μας δηλώνει ότι κάπου έχουμε κάνει κάποιο λογικό λάθος.
Μπορούμε να ελέγξουμε γραμμή-γραμμή που μπορεί να έχουμε κάνει λάθος, αλλά μπορούμε να χρησιμοποιήσουμε τον οπτικό μεταγλωττιστή του NetBeans.
Κάντε κλικ πάνω στον αριθμό γραμμής της πρώτης γραμμής της μεθόδου main()
για να εισάγετε ένα σημείο παύσης (breakpoint). Στη συνέχεια πατήστε το κουμπί Debug όπως φαίνεται στην παρακάτω εικόνα.
Εικόνα 1 Εκκίνηση του αποσφαλματωτή
Η εκτέλεση του προγράμματος θα ξεκινήσει και θα σταματήσει στη γραμμή που έχετε ορίσει το σημείο παύσης. Από δω και πέρα μπορείτε να χρησιμοποιήσετε τα κουμπιά αποσφαλμάτωσης για να μετακινηθείτε γραμμή-γραμμή στον κώδικα, να εξετάσετε τις τιμές των μεταβλητών κλπ.
Εικόνα 2 Παύση του αποσφαλματωτή σ’ ένα σημείο παύσης
Τα κουμπιά που φαίνονται μέσα στο κόκκινο πλαίσιο στην εικόνα 2 είναι τα εξής:
- Τερματισμός του αποσφαλματωτή (
Shift+F5
) - Παύση εκτέλεσης
- Συνέχεια εκτέλεσης (
F5
) - Εκτέλεση ενός βήματος χωρίς είσοδο μέσα στις μεθόδους, δηλ. οι μέθοδοι εκτελούνται σαν εντολές (
F8
) - Εκτέλεση ενός βήματος χωρίς είσοδο μέσα στις εκφράσεις (
Shift+F8
) - Εκτέλεση ενός βήματος μπαίνοντας μέσα στις μεθόδους (
F7
) - Έξοδος από τη μέθοδο
- Εκτέλεση μέχρι εκεί που βρίσκεται ο δρομέας (
F4
) - Εφαρμόζει τις αλλαγές στον κώδικα κατά τη διάρκεια της αποσφαλμάτωσης
- Λαμβάνει ένα στιγμιότυπο
Αν επιλέξατε να μην εγκαταστήσετε ένα ΟΠΕ στον Η/Υ σας, τότε μπορείτε να χρησιμοποιήσετε αυτόν τον online αποσφαλματωτή με τον οποίο μπορείτε επίσης να οπτικοποιήσετε την εκτέλεση του προγράμματός σας βήμα-βήμα.
Καλή επιτυχία και καλό κουράγιο κατά την αποσφαλμάτωση των προγραμμάτων σας.
Άσκηση
- Βρείτε τα λάθη στο παρακάτω πρόγραμμα, αναφέρετε τι κατηγορία λάθους είναι το καθένα, και διορθώστε τα ώστε να εκτελεστεί σωστά το πρόγραμμα.
import java.util.Random;
public class FortuneTeller {
public static void Main(String[] args) {
Random random = new Random();
int fortune = random.nextInt(10); // τυχαίος ακέραιος μεταξύ 0 και 9
if (fortune = 0) {
System.out.println("Your aims are high, and you are capable of much.");
} else if (fortune == 1) {
System.out.println("Don't behave with cold manners.")
} else if (fortune == 2) {
System.out.println("May you someday be carbon neutral");
} else if (fortune == 3) {
System.out.println("You are special in a way you will soon begin to understand.");
} else if (fortune == 4) {
System.out.println("A conclusion is simply the place where you got tired of thinking.");
} else if (fortune ==) {
System.out.println("No snowflake feels responsible in an avalanche.");
} else if (fortune == 6) {
System.out.println("He who laughs last is laughing at you.");
} else if (fortune == 7) {
System.out.println("If you look back, you'll soon be going that way.");
} else if (fortune == 8) {
System.out.println("Face facts with dignity.");
} else if (fortune == 9 {
System.out.println("The fortune you seek is in another cookie.");
}
}
}
Πηγές
- Αποσφαλμάτωση, Wikipedia
- Spinellis D. (2017), Effective Debugging, Addison-Wesley.
- Using the Visual Debugger in NetBeans IDE
<- | Δ | -> |