Esistono due gruppi di simboli utilizzati da gdb.
Il set -g è un simbolo di debug, che semplifica le cose in quanto consente di visualizzare il codice e analizzare le variabili durante il debug.
Un'altra serie di simboli è inclusa per impostazione predefinita durante la compilazione. Questi sono i simboli di collegamento e vivono nella tabella dei simboli ELF (eseguibile in formato collegabile). Questo contiene molte meno informazioni rispetto ai simboli di debug, ma contiene le cose più importanti, come gli indirizzi delle cose nel tuo eseguibile (o libreria o file oggetto). Senza queste informazioni gdb non saprà nemmeno dove si trova il main, quindi (gdb) break main
fallirebbe.
Se non si dispone dei simboli di debug (-g), si sarà comunque in grado di (gdb) break main
ma gdb non avrà alcun concetto delle righe di codice nel file sorgente. Quando provi a scorrere il codice, avanzerai solo 1 istruzione macchina alla volta, anziché una linea alla volta.
Il comando striscia viene spesso utilizzato per strip
simboli off da un eseguibile (o un altro file oggetto). Questo è spesso usato se non vuoi che qualcuno sia in grado di vedere i simboli o se vuoi risparmiare spazio nel file. Le tabelle dei simboli possono diventare grandi. Strip rimuove sia i simboli di debug che i simboli del linker, ma ha diversi switch a riga di comando che possono limitare ciò che rimuove.
Se si esegue il comando file
sul programma, una delle cose che ti dirà è tempo o meno l'eseguibile è stato rimosso.
$ gcc my_prog.c -o my_prog
$ file my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$ strip my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
$
Intendi dire che gdb non può essere utilizzato per eseguire il debug di programmi arbitrali? – user198729
@ user198729: Puoi usare GDB per eseguire il debug di un programma arbitrario, ma devi lavorare molto più duramente se il programma non ha una tabella dei simboli. Fondamentalmente, la tabella dei simboli indica al debugger le funzioni e le variabili, i numeri di riga e i file sorgente e, se manca, tutto ciò che rimane è assemblatore. –
@ Jonathan Leffler, sembra che tu intenda che è ancora possibile eseguire il debug del programma anche se non ha una tabella dei simboli, puoi fare un esempio? – user198729