ΕΡΓΑΣΤΗΡΙΟ 16 Χρησιμοποιώντας τον Αποσφαλματιστή (Debugger) του Eclipse 1. Δημιουργήστε ένα νέο project και ενσωματώστε το πρόγραμμα Fibonacci.java. 2. Βεβαιωθείτε ότι μεταγλωττίζει σωστά. Σχήμα 1: Adding Fibonacci.java 3. Τώρα προσθέστε ένα breakpoint (σημείο ελέγχου) μέσα στη μέθοδο main. Το breakpoint είναι ένα σημείο μέσα στον πηγαίο σας κώδικα (source code) στο οποίο θα σταματά η εκτέλεση του προγράμματος σας έτσι ώστε να μπορείτε να δείτε κάποιες πληροφορίες για την κατάσταση του προγράμματός σας. Για να δημιουργήσετε ένα breakpoint, πατήστε δεξί κλικ στην αριστερή πλευρά του Java editor στη γραμμή του κώδικα που θέλετε να σταματήσει η εκτέλεση του προγράμματός σας, (εναλλακτικά πατήστε διπλό κλικ στην αριστερή πλευρά του editor για να δημιουργήσετε ένα breakpoint.) Το κόκκινο τόξο στο Σχήμα 2 δείχνει σε ποιο σημείο θα κάνετε κλικ. Δημιουργείστε ένα breakpoint στη γραμμή που αρχικοποιείται η μεταβλητή n. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 1
Σχήμα 2: Προσθήκη breakpoint 4. Μια μπλε τελεία ( ) θα εμφανιστεί δίπλα από τη γραμμή του κώδικα που η εκτέλεση του προγράμματός σας θα παγώσει. Τώρα πρέπει να τρέξετε το πρόγραμμά σας μέσω του αποσφαλματιστή (debugger). Αυτό δουλεύει με παρόμοιο τρόπο όπως θα τρέχατε κανονικά ένα πρόγραμμα: πατ σητε δεξί κλικ πάνω στο αρχείο Fibonacci.java στο Package Explorer και διαλέξτε Debug As > Java Application Σχήμα 3: Τρέχοντας το πρόγραμμα στον debugger ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 2
5. Πιθανώς να λάβετε ένα μήνυμα σχετικό με switching perspectives αυτό είναι εντάξει. Πατήστε "Remember my decision" έτσι ώστε να μη δείτε αυτό το μήνυμα ξανά. Σχήμα 4: Επιβεβαιώνοντας το Perspective Switch 6. Πιο κάτω φαίνεται ένα στιγμιότυπο του debug perspective. Ας δούμε τις διάφορες απόψεις (views). Σχήμα 5: Στιγμιότυπο του debug perspective. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 3
o Debug: Δείχνει μια στοίβα των τρεχουσών μεθόδων. Αυτή τη στιγμή είμαστε μόνο μέσα στη συνάρτηση main του προγράμματος Fibonacci. Αν έτρεχαν κι άλλα προγράμματα θα μπορούσαμε να τα βλέπαμε εδώ. Επίσης υπάρχουν κάποια άλλα κουμπιά τα οποία θα καλύψουμε αργότερα. o Variables: δείχνει τις τιμές όλων των μεταβλητών που έχουν δηλωθεί. Εφόσον το breakpoint που βάλαμε σταματά πριν να δηλωθεί η μεταβλητή n, δεν τη βλέπουμε ακόμα. o Breakpoints: αυτή η άποψη (view) δείχνει τη θέση όλων των breakpoints μας μέσα στο κώδικα (μπορούμε να έχουμε πολλά διαφορετικά breakpoints). o Fibonacci.java: μπορούμε να δούμε που είμαστε μέσα στο κώδικά μας την ώρα που ενεργοποιείται το breakpoint 7. Στο Debug view, πατήστε το κουμπί Step Over ( ) για να πάτε στην επόμενη γραμμή. Παρατηρήστε ότι η νέα μεταβλητή n έχει δηλωθεί και έχει τη τιμή μηδέν. Όπως μπορείτε να φανταστείτε, ξέροντας τη τιμή των τιμών των μεταβλητών σας περιορίζετε την ανάγκη χρήσης της εντολής println μέσα στο κώδικά σας. Σχήμα 6: Stepping Over 8. Παρατηρήστε τώρα ότι είμαστε μέσα στο βρόχο Do και σταματημένοι στην επόμενη γραμμή. Το Step Over θα πάει στην επόμενη γραμμή μέσα στη μέθοδο και μετά θα σταματήσει (εκτός εάν υπάρχει κάποιος λόγος για να σταματήσει πριν πάει στην επόμενη γραμμή). Προσθέστε ένα breakpoint στην κλήση της μεθόδου printarray. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 4
Σχήμα 7: Το νέο breakpoint στο τέλος της μεθόδου. 9. Τώρα ας αφήσουμε το πρόγραμμα να τρέξει μέχρι να φτάσει στο επόμενο breakpoint. Πατήστε το κουμπί Resume ( ) μέσα στο Debug view για να συνεχιστεί η τρέχουσα εκτέλεση του προγράμματος. Παρατηρήστε τώρα ότι το πρόγραμμα δεν έχει τελειώσει, αλλά δεν κάνει τίποτε. Για παράδειγμα, αυτό συμβαίνει επειδή το πρόγραμμα ζητάει από το χρήστη ένα ακέραιο. Μπορούμε να δούμε ότι το πρόγραμμά μας (εδώ καλείται "Thread" "Νήμα") δεν είναι σταματημένο αλλά τρέχει μέσα στο Debug view. Τώρα λέει (Running), ενώ στο σχήμα 5 έλεγε (Suspended (breakpoint at line 6 in Fibonacci)). Σχήμα 8: Το νήμα είναι σε τρέχουσα κατάσταση (running state). 10. Στο Console view, πατήστε τον αριθμό 13 και μετά πατήστε enter. Σχήμα 9: Συνέχιση εκτέλεσης μετά την προτροπή για εισαγωγή δεδομένων. 11. Τώρα το σταμάτημα του προγράμματος γίνεται πριν την κλήση των μεθόδων getfiboarray και printarray. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 5
Σχήμα 10: Σταμάτημα του προγράμματος πριν την κλήση των μεθόδων. Προχωρώντας διαμέσου πολλαπλών μεθόδων Τώρα που έχουμε διέλθει από το μεγαλύτερο μέρος της μεθόδου main, θα προχωρήσουμε διαμέσου άλλων μεθόδων: Σιγουρευτείτε ότι έχετε ολοκληρώσει το προηγούμενο κεφάλαιο πριν ξεκινήσετε αυτό το κεφάλαιο. Έχουμε σταματήσει στη γραμμή που καλούνται οι μέθοδοι getfiboarray και printarray. Η γραμμή στην οποία έχουμε σταματήσει κάνει αρκετά. Εν πρώτοις, η μέθοδος getfiboarray εκτελείται, και έπειτα η μέθοδος printarray εκτελείται. Αν πατήσουμε το κουμπί Step Over, θα παραλείψουμε τη μετάβαση διαμέσου των μεθόδων. Για να μπούμε στο κώδικα μιας μεθόδου, χρειάζεται το κουμπί Step In ( ). Τώρα μπορείτε να πατήσετε το κουμπί Step In. Σχήμα 11: Περνώντας διαμέσου της μεθόδου getfiboarray. 1. Παρατηρείστε ότι το Variables view δείχνει νέες μεταβλητές. Αυτές είναι οι μεταβλητές που είναι τη παρούσα στιγμή σε εμβέλεια (in scope). Οι μεταβλητές που δηλώθηκαν στη μέθοδο main δεν είναι σε εμβέλεια αυτή τη στιγμή, όποτε δεν τις βλέπουμε. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 6
Σχήμα 12: Η εμβέλεια της μεθόδου getfiboarray. 2. Μπορούμε τώρα να προσθέσουμε breakpoints ή να προχωρήσουμε διαμέσου αυτής της μεθόδου. Ας χρησιμοποιήσουμε ένα άλλο τρόπο να διέλθουμε ενός προγράμματος χωρίς τη χρήση breakpoints ή διατρέχοντας γραμμή προς γραμμή: "Run to Line. Πατήστε δεξί κλικ στη γραμμή που έχει την εντολή: f[1] = 1; και επιλέξτε Run to Line. Αυτό δουλεύει χωρίς breakpoint η εκτέλεση του προγράμματος πάει μέχρι τη γραμμή που προσδιορίσαμε. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 7
Σχήμα 13: Run to line. 3. Τώρα υποθέστε ότι θέλουμε να τερματίσουμε την τρέχουσα μέθοδο και να πάμε πίσω στη μέθοδο που κάλεσε την τρέχουσα μέθοδο. Γι' αυτό, χρησιμοποιούμε το κουμπί Step Return ( ) στο Debug view. Πατήστε το κουμπί Step Return για να επιστρέψετε στη γραμμή (στη μέθοδο main) που κάλεσε που κάλεσε τη μέθοδο getfiboarray. Σχήμα 14: Step Return. 4. Πατώντας το κουμπί Step In θα μεταφερθούμε στη μέθοδο printarray. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 8
Σχήμα 15: Step Return. 5. Πατήστε Resume για να τερματίσετε το πρόγραμμα. Ειδικά Breakpoints και παρακολούθηση εκφράσεων Ειδικά Breakpoints Εκτός από το προσδιορισμό breakpoints σε συγκεκριμένους αριθμούς γραμμών, ο αποσφαλματιστής μπορεί να σταματήσει την εκτέλεση ενός προγράμματος όταν συμβεί μια εξαίρεση (exception). 1. Αρχικά βεβαιωθείτε ότι το πρόγραμμά σας δεν τρέχει. Στο Debug Perspective, πατήστε κλικ στο Breakpoints view και μετά πατήστε Remove All Breakpoints ( ). 2. Τώρα ας θέσουμε ένα breakpoint για όταν συμβεί η εξαίρεση ArrayIndexOutOfBounds. Στο Breakpoints view, πατήστε το κουμπί Add Java Exception Breakpoint ( ). Ένα παράθυρο όπως φαίνεται πιο κάτω θα εμφανιστεί για να επιλέξουμε την εξαίρεση: ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 9
Σχήμα 16: Επιλέγοντας μια εξαίρεση. 3. Το πρόγραμμα έχει εξ αρχής οριστεί να σταματά σε κάθε εξαίρεση. Αρχίστε να πληκτρολογείτε ArrayIndexOutOfBoundsException για να φιλτράρετε τα αποτελέσματα και να εμφανιστεί η εξαίρεση που θέλετε να επιλέξετε. Πατήστε Ok όταν θα έχετε επιλέξει την εξαίρεση java.lang.arrayindexoutofboundsexception ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 10
Σχήμα 17: Choosing an exception to break on. 4. Ας αλλάξουμε τον κώδικά μας έτσι ώστε να εγείρεται η εξαίρεση. Μέσα στη μέθοδο getfiboarray, αλλάξτε το σύμβολο < σε <=. Αυτό σημαίνει ότι ο βρόχος θα προσπελάσει ένα στοιχείο του πίνακα fibo το οποίο είναι εκτός ορίων του πίνακα. Σχήμα 18: Δημιουργώντας ένα σφάλμα. 5. Τρέξτε το πρόγραμμα Fibonacci ξανά στον αποσφαλματιστή (χρησιμοποιείστε το Run > Debug history > Fibonacci menu). Εισαγάγετε τον αριθμό 13 όταν σας ζητηθεί. Αν καθαρίσατε όλα τα breakpoints, ο αποσφαλματιστής θα σταματήσει όταν φτάσουμε στην εξαίρεση. Μπορείτε να δείτε ότι η εξαίρεση συνέβηκε μέσω του Debug view στο σημείο(suspended (exceptionarrayindexoutofboundsexception)) ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 11
Σχήμα 19: Δημιουργώντας ένα σφάλμα. 6. Αυτή η διαδικασία είναι πολύ χρήσιμη για να βλέπουμε τις τιμές όλων των μεταβλητών κατά την ώρα μιας εξαίρεσης. Πατήστε το κουμπί Resume για να αφήσετε το πρόγραμμα να τερματίσει. Παρακολούθηση εκφράσεων Εκτός από το ότι μπορούμε να παρακολουθούμε τις μεταβλητές μας μέσα στον αποσφαλματιστή, μπορούμε επίσης να παρακολουθούμε συγκεκριμένες εκφράσεις καθ όλη τη διάρκεια του προγράμματος. 1. Διορθώστε το σφάλμα που εσκεμμένα δημιουργήσατε προ ολίγου. 2. Προσθέστε ένα breakpoint στην αρχή της μεθόδου getfiboarray και ξεκινήστε τον αποσφαλματιστή. Δώστε ξανά σαν είσοδο τον αριθμό 13 για να οδηγηθείτε στο breakpoint μέσα στη μέθοδο getfiboarray. Σχήμα 20: Αποσφαλματίζοντας τη μέθοδο getfiboarray. 3. Προσέξτε ότι μερικές γραμμές πιο κάτω υπάρχει η έκφραση: f[i - 1] + f[i - 2]. Επιλέξτε την έκφραση αυτή και πατήστε δεξί κλικ και πηγαίνετε στο Watch. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 12
Σχήμα 21: Παρακολουθώντας μια έκφραση. 4. Προσέξτε ότι εμφανίζεται το Expression view. Η έκφραση αυτή τώρα παρακολουθείται. Σημειώστε ότι η έκφραση μας δεν έχει ακόμα τιμή. Πατώντας το (+) βλέπουμε ότι ούτε το f ούτε το i δεν έχουν ακόμα τιμή. Αυτό είναι επειδή έχουμε σταματήσει τη ροή του προγράμματος πριν την δήλωση του πίνακα f και της μεταβλητής i. Σχήμα 22: Παρακολουθώντας μια έκφραση. 5. Χρησιμοποιείστε το Step Over για να προχωρήσετε μέσα στη μέθοδο. Όταν φτάσετε στο βρόχο, παρατηρείστε ότι η έκφρασή μας ανανεώθηκε. Αυτό μπορεί να είναι ένα πολύ χρήσιμο εργαλείο για να παρακολουθούμε πολύπλοκες εκφράσεις. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 13
Σχήμα 23: Η έκφραση ανανεώνεται καθώς προχωρούμε μέσα στο πρόγραμμα. 6. Εάν θέλετε μόνο να peek σε μια συγκεκριμένη έκφραση, αλλά δεν την παρακολουθείτε, χρησιμοποιείστε την επιλογή εμφάνισης (Display option) μέσα στο μενού που εμφανίζεται με το πάτημα δεξιού κλικ. Σχήμα 24: Επιλογή εμφάνισης. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 14
Σχήμα 25: Εμφανίζοντας μια έκφραση. ΕΠΛ131 Εργαστήριο 1. Υπεύθυνοι Εργαστηρίων: Πύρρος Μπράτσκας, Παύλος Αντωνίου 15