Μετάβαση στο περιεχόμενο

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

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Αποσφαλματωτής GNU
Στιγμιότυπο του αποσφαλματωτή GNU της έκδοσης 12.1
Γενικά
Ημερ. Δημιουργίας1986
Είδοςαποσφαλματωτής
Διανομή
Έκδοση15.1 (7 Ιουλίου 2024)[1]
ΛειτουργικάGNU/Linux, BSD, Microsoft Windows, macOS
Διαθέσιμο σεΑγγλικά
Ανάπτυξη
Υπευθ. ανάπτυξηςΕγχείρημα GNU
Γραμμένο σεC, Scheme
Σύνδεσμοι
Επίσημος ιστότοπος
https://www.gnu.org/software/gdb
Αποθετήριο κώδικα
https://sourceware.org/git/binutils-gdb.git

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

Ο GDB γράφτηκε αρχικά από τον Ρίτσαρντ Στόλλμαν το 1986 σαν μέρος του συστήματος GNU, αφού ο GNU Emacs ήταν πια "αρκετά σταθερός".[2] Ο GDB είναι ελεύθερο λογισμικό κάτω από την άδεια GNU General Public License (GPL). Είχε σαν πρότυπο τον αποσφαλματωτή dbx, ο οποίος ανήκε στις διανομές του Berkeley Unix.

Από το 1990 έως το 1993 η συντήρηση του GDB γινόταν από τον Τζον Γκίλμορ όταν δούλευε για την Cygnus Solutions. Σήμερα συντηρείται από την επιτροπή του GDB (GDB Steering Committee), η οποία ορίζεται από το Ίδρυμα Ελεύθερου Λογισμικού.[3]

  • 2010 September 2: GDB 7.2[4]
  • 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. [5] Το stub προκύπτει με τη σύνδεση των κατάλληλων αρχείων stub που παρέχονται μαζί με τον GDB, τα οποία υλοποιούν την άλλη πλευρά του πρωτοκόλλου επικοινωνίας.[6] Μια εναλλακτική λύση, που δεν αλλάζει το πρόγραμμα που εξετάζεται, είναι η χρήση του 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 πρόγραμμα αποσφαλμάτωση του "προγράμματος" (από τη γραμμή εντολών)
run -v εκτελεί το πρόγραμμα που έχει ήδη φορτωθεί, με δεδομένες παραμέτρους
bt ανίχνευση κλήσεων (backtrace) όταν το πρόγραμμα έχει τερματιστεί με σφάλμα
info registers εμφανίζει όλους τους καταχωρητές
disass $pc-32, $pc+32 μετατροπή από κώδικα μηχανής σε συμβολικό κώδικα (disassemble)

Παράδειγμα χρήσης

[Επεξεργασία | επεξεργασία κώδικα]

Ακολουθεί ένα παράδειγμα χρήσης του 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 και στη συνέχεια το εκτελούμε.

  1. «GDB 15.1 released!» (στα Αγγλικά). 7 Ιουλίου 2024. Ανακτήθηκε στις 9 Ιουλίου 2024. 
  2. «Richard Stallman lecture at the Royal Institute of Technology, Sweden (1986-10-30)». Ανακτήθηκε στις 21 Σεπτεμβρίου 2006. Then after GNU Emacs was reasonably stable, which took all in all about a year and a half, I started getting back to other parts of the system. I developed a debugger which I called GDB which is a symbolic debugger for C code, which recently entered distribution. Now this debugger is to a large extent in the spirit of DBX, which is a debugger that comes with Berkeley Unix. 
  3. «GDB Steering Committee». Ανακτήθηκε στις 11 Μαΐου 2008. 
  4. http://www.gnu.org/software/gdb/news/
  5. Howto: GDB Remote Serial Protocol: Writing a RSP Server
  6. Implementing a remote stub

Εξωτερικοί σύνδεσμοι

[Επεξεργασία | επεξεργασία κώδικα]