Πώς να χρησιμοποιήσετε το GNU Debugger στο Linux

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

Ας γράψουμε πρώτα ένα μικρό πρόγραμμα C το οποίο στη συνέχεια θα διορθώσουμε. Για να ξεκινήσετε, δημιουργήστε ένα νέο .ντο αρχείο χρησιμοποιώντας δύναμη ή οποιονδήποτε συντάκτη της επιλογής σας:

τεστ vim.γ

Δημιουργήστε το ακόλουθο πρόγραμμα C:

#include int main() { int i = 5; float f = 5,5 i = i + 3; f = f + 2,2; printf("Η τιμή των i και f είναι: %d και %f\n", i, f); επιστροφή 0; }

Τύπος Διαφυγή για να μεταβείτε στη λειτουργία εντολής vim. Στη συνέχεια πληκτρολογήστε :wq για να αποθηκεύσετε το πρόγραμμα και να βγείτε.

Κάντε μεταγλώττιση και δείτε αν εκτελείται το πρόγραμμα:

gcc test.c -o test ./test Οι τιμές των i και f είναι: 8 και 7,700000

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

gcc test.c -g -o δοκιμή

Για να ξεκινήσετε τον εντοπισμό σφαλμάτων το εκτελέσιμο αρχείο μας δοκιμή σε gdb, τρέχουμε:

δοκιμή gdb

Θα ανοίξει το gdb κονσόλα, όπου μπορείτε να πληκτρολογήσετε το gdb εντολές. Για να δείτε μια λίστα εντολών χρησιμοποιήστε το βοήθεια εντολή.

$(gdb) help Λίστα τάξεων εντολών: ψευδώνυμα -- Ψευδώνυμα άλλων σημείων διακοπής εντολών -- Διακοπή προγράμματος σε δεδομένα δεδομένων -- Εξέταση αρχείων δεδομένων -- Καθορισμός και εξέταση εσωτερικών αρχείων -- Ασαφής εντολές συντήρησης -- Εκτελούνται σκοτεινές λειτουργίες -- Εκτέλεση της στοίβας προγράμματος -- Εξέταση της κατάστασης στοίβας -- Υποστήριξη ερωτημάτων κατάστασης -- Υποστήριξη των σημείων παρακολούθησης -- Παρακολούθηση της εκτέλεσης του προγράμματος χωρίς διακοπή του προγράμματος που ορίζεται από τον χρήστη -- Εντολές που καθορίζονται από το χρήστη Πληκτρολογήστε "help" ακολουθούμενο από ένα όνομα κλάσης για μια λίστα εντολών σε αυτήν την κλάση. Πληκτρολογήστε "help all" για τη λίστα όλων των εντολών. Πληκτρολογήστε "help" ακολουθούμενο από όνομα εντολής για πλήρη τεκμηρίωση. Πληκτρολογήστε "apropos word" για να αναζητήσετε εντολές που σχετίζονται με τη "λέξη". Οι συντομογραφίες ονομάτων εντολών επιτρέπονται εάν είναι σαφείς.

Στη συνέχεια, μπορείτε να πληκτρολογήσετε help class_name για να δείτε εντολές που ανήκουν σε αυτήν την κλάση. Για να αναζητήσετε εντολές χρησιμοποιώντας μια υποσυμβολοσειρά, χρησιμοποιήστε apropos substring.

Για να ορίσετε ένα σημείο διακοπής όταν το πρόγραμμα εισάγει μια συνάρτηση, τρέξιμο:

$(gdb) break main

Εδώ ορίζουμε ένα σημείο διακοπής στη μοναδική συνάρτηση του κώδικά μας, π.χ. κύριος. Χρησιμοποιήστε την εντολή τρέξιμο για να εκτελέσετε το πρόγραμμα μέχρι το επόμενο σημείο διακοπής ή μέχρι την έξοδο.

$(gdb) εκτέλεση

Για να ορίσετε ένα σημείο διακοπής σε μια συγκεκριμένη θέση σε μια συνάρτηση, χρήση:

διάλειμμα *κύριο + 4

Αυτό θα δημιουργήσει ένα σημείο διακοπής στην 4η γραμμή της κύριας συνάρτησης.

Τώρα, για να προχωρήσετε στη ροή του προγράμματος στην επόμενη γραμμή κώδικα, απλά τρέξτε το βήμα εντολή.

$(gdb) βήμα 5: float f = 5,5;

Για να εμφανίσετε τα περιεχόμενα μιας μεταβλητής, τρέξιμο απεικόνιση .

Εμφάνιση $(gdb) i 6: i = 5

Για να τροποποιήσετε τα περιεχόμενα μιας μεταβλητής, που μπορεί να απαιτείται για την ανάλυση της εκτέλεσης ενός προγράμματος κάτω από συγκεκριμένες τιμές μιας μεταβλητής, εκτέλεση set variable =Έκφραση.

$(gdb) ορίστε μεταβλητή i=10 $(gdb) εμφάνιση i 7: i = 10

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

Για να εκτυπώσετε τον κωδικό συναρμολόγησης για το πρόγραμμα, χρήση εντολής αποσυναρμολόγηση όνομα λειτουργίας:

Χρησιμοποιήστε μόνο αποσυναρμολογήστε για εκτύπωση κώδικα συναρμολόγησης για ολόκληρο το πρόγραμμα. Σημειώστε το βέλος σε μια συγκεκριμένη γραμμή στον κώδικα συναρμολόγησης. Υποδηλώνει ότι η περίοδος διόρθωσης σφαλμάτων έχει τεθεί σε παύση στη συγκεκριμένη θέση μνήμης (δηλαδή σε αυτήν τη γραμμή κώδικα).

Για να μεταβείτε το πρόγραμμα εντοπισμού σφαλμάτων σε μια συγκεκριμένη γραμμή κώδικα, τρέξιμο:

$(gdb) jump *main + 2 Συνέχεια στο 0x400528. Σημείο διακοπής 2, 0x000000000040052a στο κύριο () στο test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i = 

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

Αυτές είναι μερικές από τις βασικές εντολές που μπορούν να σας βοηθήσουν να ξεκινήσετε με τον εντοπισμό σφαλμάτων ενός εκτελέσιμου αρχείου στο Linux. Ελπίζουμε να βρείτε χρήσιμες τις πληροφορίες σε αυτή τη σελίδα.

Κατηγορία: Linux