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

Ιστορία

Ο GDB γράφτηκε αρχικά από τον Ρίτσαρντ Στόλλμαν το 1986 σαν μέρος του συστήματος GNU, αφού ο GNU Emacs ήταν πια "αρκετά σταθερός". Ο GDB είναι ελεύθερο λογισμικό κάτω από την άδεια GNU General Public License (GPL). Είχε σαν πρότυπο τον αποσφαλματωτή dbx, ο οποίος ανήκε στις διανομές του Berkeley Unix.
Από το 1990 έως το 1993 η συντήρηση του GDB γινόταν από τον Τζον Γκίλμορ όταν δούλευε για την Cygnus Solutions. Σήμερα συντηρείται από την επιτροπή του GDB (GDB Steering Committee), η οποία ορίζεται από το Ίδρυμα Ελεύθερου Λογισμικού.

Χαρακτηριστικά

Ο 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 και ο 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 και στη συνέχεια το εκτελούμε.