2013-10-07 18 views
10

Ich versuche, ein einfaches C-Projekt mit GDB zu debuggen, aber GDB scheint nicht die Debugsymbole für das Programm zu finden, egal wie ich kompiliere es.GDB sagt "keine Symboltabelle", aber nm zeigt Datei hat Debugsymbole

Wenn ich das Programm in GDB laden, sie behauptet, erfolgreich die Symbole gelesen zu haben, weil es

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

Allerdings druckt, wenn ich das Programm laufen, brechen auf einem Segmentierungsfehler, und geben info locals, sagt sie

No symbol table info available. 

auch bt zeigt, dass die Ausführung innerhalb einer Funktion gestoppt I (kein System oder Bibliotheksaufruf) geschrieben, aber es gibt keine Zeilennummer, nur rohe Speicheradressen.

Warum kann GDB die Symbole nicht finden oder verwenden, die es zuvor erfolgreich gelesen hat? Ich habe nm und objdump auf der binären Datei ausgeführt, die ich ausgeführt habe, und beide zeigen Abschnitte wie .debug_info, .debug_line, so dass die Datei tatsächlich Debugging-Symbole enthält.

ich in der Regel mit einem Makefile kompilieren, die die folgenden Flags setzen:

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

, die ich verwendet werden sehen können, wenn make gcc aufruft. Ich habe jedoch versucht, nur -g zu ändern und manuell durch Aufruf von gcc -g -O0 für eine einfache Testdatei zu kompilieren, und das Ergebnis ist immer noch das gleiche: Die Binärdatei enthält Debugsymbole, und GDB liest sie, ruft aber alle GDB-Befehle auf Eine Nachricht, dass Debug-Informationen nicht verfügbar sind.

Updates

Ich bin läuft Ubuntu 12.04 ist meine GDB Version 7.4, und meine GCC-Version ist 4.8.1.

Wenn ich set complaints 10000 in GDB und dann die Datei laden, druckt es die folgenden Beschwerden:

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. 

Sind diese Fehler die Ursache des Problems? Meinten sie, meine GDB sei die "falsche" Version?

+0

'gcc -g' gibt Ihnen symbol info.Es gibt keinen Zweifel.Können Sie bitte Ihre Testdatei oder einen Teil der Testdatei, die wir kompilieren können, veröffentlichen? haben Sie versucht, indem Sie irgendwelche Symbole mit Hilfe von p-Option – Gangadhar

+0

einen Platz zu starten, ist einfach "gdb", dann "Beschwerden 10000", und dann "file .../myexecutable" zu starten. Das wird den DWARF-Leser beschweren, wenn er seltsame Dinge in der DWARF findet. Sie erwähnen auch nicht, welche Version von GCC oder GDB Sie verwenden. Manchmal benötigt neuere gcc eine neuere gdb. –

+0

mögliches Duplikat von [C++ App auf Ubuntu. Nach der Installation von gcc 4.8.1 funktioniert die gdb nicht] (http://stackoverflow.com/questions/19129706/c-app-on-ubuntu-after-installing-gcc-4-8-1-the-gdb-does -nicht-Arbeit) –

Antwort

21

gcc 4.8.1 generiert dwarf4 Debug-Informationen, die gdb 7.4 nicht verstehen kann. Sie müssen gdb 7.6

+0

Ich habe gdb 7.11 und kämpfen mit dem gleichen Problem. – Blauhirn

+0

haben das gleiche Problem mit gcc 4.8.5 und gdb 7.6.1 – Sergei

+0

Haben Sie das gleiche Problem mit gcc 4.9.1 und gdb 7.2-90.el6 – firo

1

gdb lesen .debug_info Abschnitt vor .symtab .dynsym.

nm gerade gelesen .symtab .dynsym.

Das liegt daran, dass der Abschnitt .debug_info in Ihrer ELF-Datei gestreift war.

können Sie verwenden:

readelf -S youelf | grep -i debug 

zu überprüfen, ob DEBUG_INFO vorhanden ist.

10

Zusätzlich zu Chris Dodds Antwort können Sie auch Ihren Code mit gcc -gdwarf-3 kompilieren, der mit dwarf3 debug info kompiliert. Welche ist kompatibel mit Ihrer GDB-Version?

Verwandte Themen