Αποσφαλματωτής GNU

Ο αποσφαλματωτής GNU (GNU Debugger), που συνήθως αποκαλείται GDB, με το εκτελέσιμό του να έχει το όνομα gdb, είναι ο αποσφαλματωτής του συστήματος λογισμικού GNU. Είναι μεταφέρσιμος: εκτελείται σε πολλά συστήματα Unix και λειτουργεί με διάφορες γλώσσες προγραμματισμού, όπως η Ada, η C, η C++, η Objective-C, η FreeBASIC, η Free Pascal και η Fortran.

 Ο GDB γράφτηκε αρχικά από τον Ρίτσαρντ Στόλλμαν το 1986 σαν μέρος του συστήματος GNU, αφού ο GNU Emacs ήταν πια "αρκετά σταθερός". Ο GDB είναι ελεύθερο λογισμικό κάτω από την άδεια GNU General Public License (GPL). Είχε σαν πρότυπο τον αποσφαλματωτή dbx, ο οποίος ανήκε στις διανομές του Berkeley Unix. Από το 1990 έως το 1993 η συντήρηση του GDB γινόταν από τον Τζον Γκίλμορ όταν δούλευε για την Cygnus Solutions. Σήμερα συντηρείται από την επιτροπή του GDB (GDB Steering Committee), η οποία ορίζεται από το Ίδρυμα Ελεύθερου Λογισμικού. 2010 September 2: GDB 7.2 2010 March 18: GDB 7.1 2009 October 6: GDB 7.0 2008 March 27: GDB 6.8 2003 October 3: GDB 6.0 Ο GDB προσφέρει σημαντικά χαρακτηριστικά για την παρακολούθηση (tracing) και την τροποποίηση της εκτέλεσης των προγραμμάτων. Ο χρήστης μπορεί να εξετάζει και να τροποποιεί τις τιμές των εσωτερικών μεταβλητών των προγραμμάτων, και μπορεί ακόμα και να καλέσει υπορουτίνες που είναι ανεξάρτητες από την κανονική συμπεριφορά του προγράμματος. Επεξεργαστές στους οποίους εκτελείται ο GDB είναι μεταξύ άλλων: οι Alpha, οι ARM, οι AVR, οι H8/300, τα συστήματα System/370 και System 390, η πλατφόρμα x86 και η επέκτασή της στα 64-bit x86-64, οι IA-64 "Itanium", ο Motorola 68000, οι MIPS, οι PA-RISC, οι PowerPC, οι SuperH, οι SPARC και οι VAX. Λιγότερο γνωστοί επεξεργαστές που υποστηρίζονται είναι ο A29K, ο ARC, ο ETRAX CRIS, ο D10V, ο D30V, ο FR-30, ο FR-V, ο Intel i960, ο M32R, ο 68HC11, ο Motorola 88000, ο MCORE, ο MN10200, ο MN10300, ο NS32K, ο Stormy16, ο V850 και ο Z8000. (Είναι πιθανό κάποιες από τις νεότερες εκδόσεις να μην υποστηρίζουν όλους τους παραπάνω.) Ο GDB περιέχει μεταγλωττισμένους εξομοιωτές συνόλου εντολών (Instruction Set Simulators) για πιο σπάνιους επεξεργαστές όπως ο M32R ή ο V850. Ο GDB εξακολουθεί να αναπτύσσεται. Η έκδοση 7.0 εισήγαγε υποστήριξη για σενάρια Python και «αντιστρεπτή αποσφαλμάτωση» ("reversible debugging"), τη δυνατότητα μια συνεδρία αποσφαλμάτωσης να πηγαίνει προς τα πίσω, ώστε να φαίνεται τι συνέβη σε ένα πρόγραμμα που οδηγήθηκε σε τερματισμό λόγω σφάλματος. Ο GDB προσφέρει μια 'απομακρυσμένη' ('remote') κατάσταση για την αποσφαλμάτωση ενσωματωμένων συστημάτων. Η απομακρυσμένη αυτή λειτουργία προκύπτει όταν ο GDB εκτελείται σε έναν υπολογιστή και το πρόγραμμα που εξετάζεται εκτελείται σε διαφορετικό υπολογιστή. Ο GDB μπορεί τότε να επικοινωνήσει με το άλλο άκρο (stub) μέσω του πρωτοκόλλου GDB, είτε μέσω σειριακής σύνδεσης, είτε μέσω TCP/IP. Το stub προκύπτει με τη σύνδεση των κατάλληλων αρχείων stub που παρέχονται μαζί με τον GDB, τα οποία υλοποιούν την άλλη πλευρά του πρωτοκόλλου επικοινωνίας. Μια εναλλακτική λύση, που δεν αλλάζει το πρόγραμμα που εξετάζεται, είναι η χρήση του gdbserver για απομακρυσμένη αποσφαλμάτωση. Η ίδια κατάσταση χρησιμοποιείται και από τον KGDB για την αποσφαλμάτωση στο επίπεδο του πηγαίου κώδικα, ενός πυρήνα Linux που εκτελείται, με χρήση του gdb. Οι προγραμματιστές του πυρήνα μπορούν με τον KGDB να αποσφαλματώσουν έναν πυρήνα με περίπου τον ίδιο τρόπο που θα το έκαναν αυτό σε ένα απλό πρόγραμμα εφαρμογών. Δίνει τη δυνατότητα να τοποθετηθούν σημεία διακοπής (breakpoints) στον κώδικα του πυρήνα, να εκτελεστεί ο κώδικας βήμα-βήμα (step) και να παρατηρηθούν οι τιμές των μεταβλητών. Σε αρχιτεκτονικές που είναι διαθέσιμοι καταχωρητές αποσφαλμάτωσης σε επίπεδο υλικού, μπορούν να τοποθετηθούν σημεία παρακολούθησης (watchpoints) που να ενεργοποιούν σημεία διακοπής όταν εκτελούνται, διαβάζονται ή γράφονται συγκεκριμένες διευθύνσεις μνήμης. Ο KGDB απαιτεί έναν επιπλέον υπολογιστή, ο οποίος να είναι συνδεδεμένος με τον υπολογιστή που γίνεται η αποσφαλμάτωση μέσω ενός σειριακού καλωδίου ή καλωδίου ethernet. Στο FreeBSD μπορεί επίσης να γίνει αποσφαλμάτωση μέσω απευθείας πρόσβασης στη μνήμη (direct memory access, DMA) μέσω Firewire. Ο αποσφαλματωτής δεν διαθέτει το δικό του γραφικό περιβάλλον χρήστη, μόνο ένα κειμενικό περιβάλλον χρήστη (text-based user interface) μέσω της βιβλιοθήκης curses και ένα περιβάλλον γραμμής εντολών (που είναι και το προεπιλεγμένο). Υπάρχουν πολλά προγράμματα που προσφέρουν εμπρόσθια μέρη (front-ends) για τον gdb, όπως ο Xxgdb, ο Data Display Debugger (DDD), ο Nemiver, ο KDbg, ο αποσφαλματωτής του Xcode, ο GDBtk/Insight Αρχειοθετήθηκε 2012-10-16 στο Wayback Machine. και ο WDB. Τα ολοκληρωμένα περιβάλλοντα ανάπτυξης όπως το Codelite, το Code::Blocks, το GNAT Programming Studio (GPS), το KDevelop, το Qt Creator, το MonoDevelop, το Eclipse, το NetBeans και το VisualStudio (βλ. VS AddIn Gallery) μπορούν να χρησιμοποιήσουν τον GDB. Ο GNU Emacs έχει μια κατάσταση ("GUD mode") για τη χρήση του GDB και υπάρχουν αρκετά εργαλεία για τον VIM. Άλλα εργαλεία μπορούν επίσης να επικοινωνήσουν με τον GDB, όπως οι ανιχνευτές διαρροών μνήμης (memory leak detectors). Ακολουθεί ένα παράδειγμα χρήσης του GDB: GNU gdb Red Hat Linux (6.3.0.0-1.21rh) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1". (gdb) run Starting program: /home/sam/programming/crash Reading symbols from shared object read from target memory...done. Loaded system supplied DSO at 0xc11000 This program will demonstrate gdb Program received signal SIGSEGV, Segmentation fault. 0x08048428 in function_2 (x=24) at crash.c:22 22 return *y; (gdb) edit (gdb) shell gcc crash.c -o crash -gstabs+ (gdb) run The program being debugged has been started already. Start it from the beginning? (y or n) y warning: cannot close "shared object read from target memory": File in wrong format `/home/sam/programming/crash' has changed; re-reading symbols. Starting program: /home/sam/programming/crash Reading symbols from shared object read from target memory...done. Loaded system supplied DSO at 0xa3e000 This program will demonstrate gdb 24 Program exited normally. (gdb) quit Το πρόγραμμα εκτελείται - όταν βρεθεί η αιτία του σφάλματος κατάτμησης (segmentation fault), διορθώνουμε τον πηγαίο κώδικα του προγράμματος, το μεταγλωττίζουμε πάλι με τον GCC και στη συνέχεια το εκτελούμε. Εργαλείο προγραμματισμού Συμβολική γλώσσα C (γλώσσα προγραμματισμού) GNU Επίσημη ιστοσελίδα KGDB: Linux Kernel Source Level Debugger GDB, Stan Shebs, The Architecture of Open Source Applications, Volume II. Richard M. Stallman, Roland Pesch, Stan Shebs, et al., Debugging with GDB (Free Software Foundation, 2002) ISBN 1-882114-88-4 GDB Internals Peter Jay Salzman's GDB guide: Using The GNU GDB Debugger (Peter Jay Salzman) RMS's gdb Tutorial (Ryan Schmidt)