Το GDB είναι ένας εντοπισμός σφαλμάτων για C, C++, Objective-C, Pascal, Fortran, Go, D, OpenCL C, Ada και Modula-2.
Το CentOS βασίζεται στο RHEL (Red Hat Enterprise Linux). Ένας από τους κύριους στόχους της RHEL είναι να είναι ένα σταθερό λειτουργικό σύστημα διακομιστή, πράγμα που σημαίνει ότι οι νεότερες εκδόσεις πακέτων λογισμικού δεν είναι πάντα διαθέσιμες.
Κατά τη στιγμή της γραφής, το CentOS 6 προσφέρει GDB v7.2. Ωστόσο, η ομάδα GDB κυκλοφόρησε πρόσφατα τον κωδικό για την έκδοση 7.91.
Προτείνεται επίσημα η εκτέλεση μιας διαφορετικής διανομής Linux προκειμένου να χρησιμοποιηθεί μια νεότερη έκδοση του GDB. Αυτό δεν είναι πάντα ιδανικό. Ευτυχώς, είναι δυνατό να εγκαταστήσετε τις νεότερες εκδόσεις του GDB στο CentOS 6. Εφόσον το GDB είναι ένας εντοπισμός σφαλμάτων και όχι ένα βασικό στοιχείο συστήματος, μπορείτε να χρησιμοποιήσετε μια νεότερη έκδοση.
Αυτό το άρθρο εξηγεί πώς να εγκαταστήσετε τόσο τις υποστηριζόμενες όσο και τις μη υποστηριζόμενες εκδόσεις του GDB στο CentOS 6.
Θα εξηγήσω επίσης πώς να ρυθμίσετε το GDB για να σας δώσω πιο ευανάγνωστες πληροφορίες εντοπισμού σφαλμάτων όταν χρησιμοποιείτε την Τυπική βιβλιοθήκη C++ (όπως συμβολοσειρά) και την Τυπική βιβλιοθήκη προτύπων (όπως διάνυσμα). Αυτή η δυνατότητα ονομάζεται όμορφη εκτύπωση.
Συνδεθείτε στο VPS σας και ρυθμίστε τον λογαριασμό χρήστη σας
-
Συνδεθείτε στο VPS σας. Αυτό μπορεί να γίνει κάνοντας κλικ στην "Προβολή κονσόλας" στον πίνακα ελέγχου Vultr ή με έναν πελάτη SSH.
(α) Είσοδος ως root.
(β) Δημιουργήστε τον δικό σας λογαριασμό χρήστη. Ορίστε τον κωδικό πρόσβασης.
adduser <username>
passwd <username>
(γ) Παραχωρήστε στον χρήστη πρόσβαση sudo.
visudo
After the line "root ALL=(ALL) ALL"
Add the line "<username> ALL=(ALL) ALL"
--- If you aren't familiar with vi, go to the line "root ALL=(ALL) ALL".
--- Hit "o" to create a new line after that line and enter insert mode.
--- Type "<username> ALL=(ALL) ALL".
--- Hit ESC.
--- Type "ZZ" to save.
(δ) Αποσυνδεθείτε ως root και, στη συνέχεια, συνδεθείτε ξανά με τον λογαριασμό χρήστη σας. Είναι πολύ πιο ασφαλές να μην συνδέεστε ποτέ πραγματικά ως root. Η χρήση του sudo είναι καλύτερη πρακτική.
Εάν θέλετε να εγκαταστήσετε την επίσημα υποστηριζόμενη (παλαιότερη) έκδοση του GDB
-
Εγκαταστήστε το GDB.
sudo yum install gdb
-
Ελέγξτε την εγκατεστημένη έκδοση και δείτε τη θέση της.
gdb --version
May say: GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6)
which gdb
/usr/bin/gdb
Εάν θέλετε να εγκαταστήσετε μια νεότερη έκδοση του GDB από την πηγή
-
Εγκαταστήστε έναν μεταγλωττιστή C, όπως το GCC. Ένας μεταγλωττιστής C++ δεν χρειάζεται για τη δημιουργία του GDB από την πηγή, αλλά χρειάζεται για να επιδείξει την όμορφη δυνατότητα εκτύπωσης του GDB. Μπορείτε να δημιουργήσετε μια πιο πρόσφατη έκδοση του GCC από την πηγή εκτελώντας τα βήματα στο άρθρο Πώς να εγκαταστήσετε το GCC στο CentOS 6 . Εναλλακτικά, μπορείτε να εγκαταστήσετε την επίσημα υποστηριζόμενη έκδοση του GCC με το CentOS 6 εκτελώντας:
sudo yum install gcc gcc-c++
-
Εγκαταστήστε επιπλέον απαιτούμενα πακέτα.
sudo yum install wget tar gzip ncurses-devel texinfo svn python-devel
-
Αποφασίστε ποια έκδοση του GDB θέλετε να δημιουργήσετε από την πηγή. Επισκεφτείτε την τοποθεσία GDB FTP για να δείτε τις εκδόσεις που είναι διαθέσιμες για λήψη.
-
Λάβετε την πηγή της έκδοσης του GDB που θέλετε. Το υπόλοιπο αυτού του άρθρου είναι γραμμένο για την έκδοση 7.9.1 και θα πραγματοποιήσει λήψη των πηγών ~/sourceInstallations/gdb-7.9.1/- θα πρέπει να αντικαταστήσετε τον σωστό αριθμό έκδοσης με νεότερες εκδόσεις.
mkdir ~/sourceInstallations
cd ~/sourceInstallations
wget ftp://ftp.gnu.org/gnu/gdb/gdb-7.9.1.tar.gz .
tar -zxvf gdb-7.9.1.tar.gz
-
Δημιουργία GDB. Εάν αυτό ολοκληρωθεί σωστά, η τελευταία γραμμή που θα δείτε θα λέει "επιτυχία". Είναι φυσιολογικό να βλέπετε ορισμένα μηνύματα που δείχνουν σφάλμα να μετακινούνται γρήγορα. Αυτά είναι ασφαλή να τα αγνοήσετε.
mkdir gdb-7.9.1.build
cd gdb-7.9.1.build
../gdb-7.9.1/configure --with-python=yes && make && sudo make install && echo success
--- If your VPS has multiple cores, you can speed up the build by changing the middle part
--- of this line from "&& make &&" to "&& make -j <number of cores> &&".
--- You can see the number of cores your VPS has by running "nproc"
--- The parameter "--with-python=yes" is necessary for the pretty printing feature
-
Εγκαταστήστε την όμορφη εκτύπωση C++.
cd ~/
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python gdb_printers
Create a file ~/.gdbinit of:
python
import sys
sys.path.insert(0, '/home/<yourUserName>/gdb_printers/')
from libstdcxx.v6.printers import register_libstdcxx_printers
end
--- One way to create this file is to run "vi ~/.gdbinit", hitting "i" to enter insert mode,
--- typing the above file, hitting ESC, and hitting "ZZ" to save.
-
Ελέγξτε την εγκατεστημένη έκδοση και τη θέση της.
gdb --version
May say: GNU gdb (GDB) 7.9.1
which gdb
/usr/local/bin/gdb
-
Προαιρετικά εκτελέστε το GDB και δείτε όμορφη εκτύπωση.
mkdir ~/gdbExample
cd ~/gdbExample
Create a file gdbExample.cpp of:
#include <string>
#include <vector>
using namespace std;
int main() {
string foo = "bar";
vector<string> vec;
vec.push_back("foo");
vec.push_back("bar");
vec.push_back("foobar");
}
--- One way to create this file is to run "vi gdbExample.cpp", hitting "i" to enter insert mode,
--- typing the above file, hitting ESC, and hitting "ZZ" to save.
g++ -ggdb gdbExample.cpp -o gdbExample
Start GDB traditionally, by running "gdb ./gdbExample". Or, start GDB by using its terminal user interface (basically a text mode GUI), by running "gdb --tui ./gdbExample".
Enter "break main" to set a breakpoint at the beginning of function main() -- and it will say:
Breakpoint 1 at 0x<someAddress>: file gdbExample.cpp, line 6.
Enter "run" to start the program, which will immediately hit the breakpoint you just set -- and it will say:
Starting program: /home/<yourUserName>/gdbExample/gdbExample
Breakpoint 1, main () at gdbExample.cpp:6
6 string foo = "bar";
Enter "next" and hit enter four times, and gdb will move up to just before executing:
10 vec.push_back("foobar");
Enter "print foo" and gdb will show:
$1 = "bar"
Enter "print vec" and gdb will show:
$2 = std::vector of length 2, capacity 2 = {"foo", "bar"}
--- Remember, line 10 hasn't executed yet to add "foobar" to the vector
Enter "quit" and "y" to quit anyway.
-
Προαιρετικά ανακτήστε χώρο στον σκληρό δίσκο. Ο ~/sourceInstallationsκατάλογός σας θα καταλαμβάνει περίπου 386 MB. Είναι πιθανώς συνετό να διατηρήσετε τους καταλόγους, καθώς υπάρχουν προαιρετικές επιλογές διαμόρφωσης που μπορεί να χρειαστεί να χρησιμοποιήσετε κάποια στιγμή στο μέλλον και θα ήταν πιο γρήγορο να έχετε ήδη κάνει πολλά. Επίσης, η διαδικασία κατασκευής δημιουργεί αρχεία καταγραφής που μπορείτε αργότερα να ελέγξετε και να εργαστείτε εάν κάτι πάει στραβά. Ωστόσο, μετά την εκτέλεση sudo make installνωρίτερα, το εγκατεστημένο GDB σας δεν εξαρτάται από τίποτα σε αυτόν τον κατάλογο και ο χώρος μπορεί να είναι υψηλότερος, επομένως μπορείτε να κάνετε αυτό το βήμα και να ανακτήσετε τα 386 MB περίπου. ΣΗΜΑΝΤΙΚΟ: μην διαγράψετε τον ~/gdb_printers/κατάλογο! Τα περιεχόμενα αυτού του καταλόγου φορτώνονται κάθε φορά που εκτελείτε το GDB. ΔΕΝ συγκεντρώθηκαν στο ίδιο το GDB.
cd ~/
rm -rf sourceInstallations
--- Again, if you can spare the space, you may someday be happy to have left it there.