GDB è un debugger per C, C ++, Objective-C, Pascal, Fortran, Go, D, OpenCL C, Ada e Modula-2.
CentOS è basato su RHEL (Red Hat Enterprise Linux). Uno degli obiettivi principali di RHEL è quello di essere un sistema operativo server stabile, il che significa che le versioni più recenti dei pacchetti software non sono sempre disponibili.
Al momento in cui scrivo, CentOS 6 offre GDB v7.2. Il team GDB, tuttavia, ha recentemente rilasciato il codice per v7.91.
Si consiglia ufficialmente di eseguire una distro Linux diversa per utilizzare una versione più recente di GDB. Questo non è sempre l'ideale. Fortunatamente, è possibile installare le versioni più recenti di GDB su CentOS 6. Poiché GDB è un debugger piuttosto che un componente centrale del sistema, è abbastanza sicuro utilizzare una versione più recente.
Questo articolo spiega come installare le versioni supportate e non supportate di GDB su CentOS 6.
Spiegherò anche come impostare GDB per fornire informazioni di debug più facili da leggere quando si utilizza la libreria standard C ++ (come stringa) e la libreria di modelli standard (come vettore). Questa funzione si chiama bella stampa.
Accedi al tuo VPS e configura il tuo account utente
-
Accedi al tuo VPS. Questo può essere fatto facendo clic su "Visualizza console" nel pannello di controllo di Vultr o con un client SSH.
(a) Accedi come root.
(b) Crea il tuo account utente. Imposta la password.
adduser <username>
passwd <username>
(c) Concedi all'utente l'accesso 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.
(d) Disconnettersi come root, quindi accedere nuovamente con il proprio account utente. È molto più sicuro non effettuare mai l'accesso come root. L'uso di sudo è una pratica migliore.
Se vuoi installare la versione ufficialmente supportata (precedente) di GDB
-
Installa GDB.
sudo yum install gdb
-
Controlla la versione installata e vedi la sua posizione.
gdb --version
May say: GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6)
which gdb
/usr/bin/gdb
Se si desidera installare una versione più recente di GDB dalla fonte
-
Installa un compilatore C, come GCC. Un compilatore C ++ non è necessario per creare GDB dal sorgente, ma è necessario per dimostrare la bella funzionalità di stampa di GDB. È possibile creare una versione più recente di GCC dall'origine eseguendo i passaggi nell'articolo Come installare GCC su CentOS 6 . In alternativa, è possibile installare la versione ufficialmente supportata di CentOS 6 di GCC eseguendo:
sudo yum install gcc gcc-c++
-
Installa pacchetti aggiuntivi richiesti.
sudo yum install wget tar gzip ncurses-devel texinfo svn python-devel
-
Decidi quale versione di GDB vuoi costruire dalla fonte. Visita il sito FTP GDB per vedere le versioni disponibili per il download.
-
Ottieni la fonte della versione di GDB che desideri. Il resto di questo articolo è scritto per v7.9.1 e scaricherà i sorgenti in ~/sourceInstallations/gdb-7.9.1/
- dovrai sostituire il numero di versione corretto per le versioni più recenti.
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
-
Costruisci GDB. Se questo si completa correttamente, l'ultima riga che vedrai dirà "successo". È normale vedere scorrere rapidamente alcuni messaggi dall'aspetto errato. Questi sono sicuri da ignorare.
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
-
Installa C ++ pretty printing.
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.
-
Controlla la versione installata e la sua posizione.
gdb --version
May say: GNU gdb (GDB) 7.9.1
which gdb
/usr/local/bin/gdb
-
Opzionalmente esegui GDB e vedi una stampa carina.
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.
-
Facoltativamente, recuperare spazio sul disco rigido. La tua ~/sourceInstallations
directory occuperà circa 386 MB. Probabilmente è saggio mantenere le directory, poiché ci sono opzioni di configurazione opzionali che potresti dover usare ad un certo punto in futuro, e sarebbe più veloce avere già fatto molto. Inoltre, il processo di creazione crea registri che è possibile controllare e lavorare in seguito se qualcosa va storto. Ma, dopo aver eseguito sudo make install
prima, il GDB installato non dipende da nulla in questa directory e lo spazio può essere un premio, quindi puoi fare questo passaggio e recuperare i 386 MB o giù di lì. IMPORTANTE: non cancellare la ~/gdb_printers/
directory! Il contenuto di questa directory viene caricato ogni volta che si esegue GDB. NON sono stati compilati in GDB stesso.
cd ~/
rm -rf sourceInstallations
--- Again, if you can spare the space, you may someday be happy to have left it there.