Skip to the content.

2.7 Αποσφαλμάτωση

© Γιάννης Κωστάρας


< Δ

Μαθησιακοί στόχοι

Σε αυτήν την ενότητα θα μάθουμε:

Εισαγωγή

Η λέξη “Bug” (ή σφάλμα στην ελληνική του απόδοση) προέρχεται από τη ναύαρχο Grace Hopper το 1947 καθώς εργαζόταν σε έναν Η/Υ τύπου Mark II στο Harvard. Η δυσλειτουργία του προγράμματος οφειλόταν σ’ ένα ζωύφιο (bug) που είχε κολλήσει σ’ ένα κύκλωμα, οπότε η διαδικασία αποκόλλησής του ονομάστηκε debugging. (Wikipedia)

Υπάρχουν πολλών ειδών bugs που θα αντιμετωπίσετε στη Java:

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

Διαδικασία:

  1. Πίστεψε ότι το πρόβλημα μπορεί να λυθεί και επέμενε μέχρι τη λύση του
  2. Επανάληψη/επιβεβαίωση του προβλήματος (αν το πρόβλημα είναι αναπαραγώσιμο)
  3. Απομόνωση του σημείου που εμφανίζεται το σφάλμα (συνήθως από τα αρχεία καταγραφής – logs)
  4. Αναγνώριση της αιτίας που το προκαλεί
  5. Διόρθωση του σφάλματος
  6. Επιβεβαίωση της διόρθωσης

Με τη βοήθεια ενός αποσφαλματωτή (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 όπως φαίνεται στην παρακάτω εικόνα.

Εικόνα 2.7.1 Εκκίνηση του αποσφαλματωτή

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

Εικόνα 2.7.2 Παύση του αποσφαλματωτή σ’ ένα σημείο παύσης

Τα κουμπιά που φαίνονται μέσα στο κόκκινο πλαίσιο στην εικόνα 2 είναι τα εξής:

Αποσφαλμάτωση με το Visual Studio Code

Αντίστοιχα δουλεύει και η αποσφαλμάτωση στο VSCode. Ορίστε τα σημεία παύσης (breakpoints) όπως και στο NetBeans. Από το μενού Run μπορείτε να επιλέξετε Start Debugging για αποσφαλμάτωση (αντί για Run Without Debugging για εκτέλεση του κώδικα).

Αποσφαλμάτωση με το BlueJ

Ορίστε και εδώ σημεία αναστολής (breakpoints) στο κενό στα αριστερά του κειμενογράφου. Όταν τρέξετε την main() η εκτέλεση θα σταματήσει στο πρώτο σημείο αναστολής και θα εμφανιστεί το παρακάτω παράθυρο με τις μεταβλητές και τις τιμές τους εκείνη τη στιγμή.

Εικόνα 2.7.3 Αποσφαλματωτής του BlueJ

Αποσφαλμάτωση χωρίς ΟΠΕ

Αν επιλέξατε να μην εγκαταστήσετε ένα ΟΠΕ στον Η/Υ σας, τότε μπορείτε να χρησιμοποιήσετε αυτόν τον online αποσφαλματωτή με τον οποίο μπορείτε επίσης να οπτικοποιήσετε την εκτέλεση του προγράμματός σας βήμα-βήμα.

Καλή επιτυχία και καλό κουράγιο κατά την αποσφαλμάτωση των προγραμμάτων σας.

Άσκηση

  1. Βρείτε τα λάθη στο παρακάτω πρόγραμμα, αναφέρετε τι κατηγορία λάθους είναι το καθένα, και διορθώστε τα ώστε να εκτελεστεί σωστά το πρόγραμμα.
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.");
            
        }
    }
}

Πηγές

  1. Αποσφαλμάτωση, Wikipedia
  2. Horstmann C., Big Java 5 - Chapter 6 - Loops
  3. Kolling M. (μετάφραση Ζερβός Τ.) (), Το εγχειρίδιο του BlueJ, έκδοση 1.4, University of Southern Denmark.
  4. Spinellis D. (2017), Effective Debugging, Addison-Wesley.
  5. Using the Visual Debugger in NetBeans IDE

< Δ