2013-10-07 8 views
10

Sto provando a eseguire il debug di un semplice progetto C usando GDB, ma GDB non sembra trovare i simboli di debug per il programma, non importa come compilo esso.GDB dice "nessuna tabella dei simboli", ma nm mostra il file ha i simboli di debug

Quando carico il programma in GDB, si dichiara di aver letto i simboli con successo, perché la stampa

Reading symbols from /home/edward/<executable>...done. 

Tuttavia, quando si esegue il programma, break su un errore di segmentazione e digitare info locals, si dice

No symbol table info available. 

Inoltre, bt mostra che l'esecuzione fermato all'interno di una funzione che ho scritto (non un sistema o segnatura), ma non c'è numero di riga, solo indirizzi di memoria prime.

Perché GDB non può trovare o utilizzare i simboli letti correttamente? Ho eseguito nm e objdump sul file binario che sto utilizzando, ed entrambi mostrano sezioni come .debug_info, .debug_line, quindi il file contiene infatti simboli di debug.

solito compilare con un Makefile che imposta i seguenti flag:

CFLAGS = -mno-red-zone -fno-omit-frame-pointer -ggdb -O0 -I. -Wdeclaration-after-statement -Wall 

che posso vedere sono utilizzati quando faccia invoca gcc. Tuttavia, ho provato a passare a -g e alla compilazione manuale invocando gcc -g -O0 su un semplice file di test, e il risultato è sempre lo stesso: il file binario contiene i simboli di debug e GDB li legge, ma il richiamo di un comando GDB risulta in un messaggio che le informazioni di debug non sono disponibili.

Aggiornamenti

Io corro Ubuntu 12.04, la mia versione GDB è 7.4, e la mia versione GCC 4.8.1 è.

Se set complaints 10000 in GDB e poi caricare il file, esso stampa le seguenti censure:

Reading symbols from /home/edward/<snip>/minithread... 
DW_AT_low_pc 0x400690 is not < DW_AT_high_pc 0x33 for DIE at 0x205 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x4006c3 is not < DW_AT_high_pc 0xa9 for DIE at 0x235 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x40076c is not < DW_AT_high_pc 0xad for DIE at 0x287 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400819 is not < DW_AT_high_pc 0xe7 for DIE at 0x2d3 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400900 is not < DW_AT_high_pc 0x4f for DIE at 0x345 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x40094f is not < DW_AT_high_pc 0x55 for DIE at 0x39d [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x4009a4 is not < DW_AT_high_pc 0x38 for DIE at 0x3e7 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x4009dc is not < DW_AT_high_pc 0x43 for DIE at 0x433 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400a20 is not < DW_AT_high_pc 0x2e for DIE at 0x56c [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400a4e is not < DW_AT_high_pc 0x2e for DIE at 0x5aa [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400a7c is not < DW_AT_high_pc 0x29 for DIE at 0x5d4 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400aa5 is not < DW_AT_high_pc 0x49 for DIE at 0x620 [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400aee is not < DW_AT_high_pc 0xca for DIE at 0x66c [in module /home/edward/<snip>/minithread] 
...DW_AT_low_pc 0x400bb8 is not < DW_AT_high_pc 0x7bb for DIE at 0x6f0 [in module /home/edward/<snip>/minithread]...done. 

sono questi errori la causa del problema? Intendono dire che il mio GDB è la versione "sbagliata"?

+0

'gcc -g' fornisce informazioni sui simboli. Non vi è alcun dubbio.Puoi per favore pubblicare il tuo file di test o parte del file di test che possiamo compilare. hai provato a stampare qualsiasi simbolo con l'aiuto dell'opzione p – Gangadhar

+0

Un punto da cui iniziare è eseguire "gdb", quindi "imposta reclami 10000", quindi "file .../eseguibile". Questo farà sì che il lettore DWARF si lamenti se trova cose strane nel DWARF. Inoltre non si menziona quale versione di GCC o gdb si sta utilizzando. A volte il gcc più recente richiede un gdb più recente. –

+0

possibile duplicato di [app C++ su Ubuntu. Dopo aver installato gcc 4.8.1 il gdb non funziona] (http://stackoverflow.com/questions/19129706/c-app-on-ubuntu-after-installing-gcc-4-8-1-the-gdb-does -non-lavoro) –

risposta

21

gcc 4.8.1 genera informazioni di debug di dwarf4 che gdb 7.4 non è in grado di comprendere. È necessario installare gdb 7.6

+0

Ho ottenuto gdb 7.11 e ho problemi con lo stesso problema. – Blauhirn

+0

hanno lo stesso problema con gcc 4.8.5 e gdb 7.6.1 – Sergei

+0

hanno lo stesso problema con gcc 4.9.1 e gdb 7.2-90.el6 – firo

1

gdb leggere la sezione .debug_info prima di .symtab .dynsym.

nm basta leggere .symtab .dynsym.

È perché la sezione .debug_info nel file ELF era a strisce.

È possibile utilizzare:

readelf -S youelf | grep -i debug 

per controllare wether debug_info è presente.

10

Oltre alla risposta di Chris Dodd, è possibile anche compilare il codice con gcc -gdwarf-3, che viene compilato con le informazioni di debug di dwarf3. Quale è compatibile con la tua versione GDB.