2013-08-23 12 views
7

ho costruito e installato GCC 4.8.1 dai sorgenti:GCC non produce linea di informazioni sul numero, anche con l'opzione -g

$ gcc -v 
Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.8.1/lto-wrapper 
Target: x86_64-unknown-linux-gnu 
Configured with: ./configure --disable-multilib 
Thread model: posix 
gcc version 4.8.1 (GCC) 

E ho scritto un semplice programma inutile:

$ cat hw.c 
#include <stdio.h> 

void foo() 
{ 
    int a; 
    scanf("%d", &a); /* So I can press ctrl+c here. */ 
    printf("Hello world!\n"); 
} 

int main() 
{ 
    foo(); 
} 

Ora compilo questo:

$ gcc -g -O0 hw.c -o hw 

poi ha iniziato il debug con GDB :

$ gdb hw 
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04 
Copyright (C) 2012 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
For bug reporting instructions, please see: 
<http://bugs.launchpad.net/gdb-linaro/>... 
Reading symbols from /home/calmarius/workdir/crucible/hw/hw...done. 
(gdb) 

Run it e Ctrl + C immediatamente:

(gdb) run 
Starting program: /home/dcsirmaz/workdir/crucible/hw/hw 
^C 
Program received signal SIGINT, Interrupt. 
0x00007ffff7b018b0 in __read_nocancel() at ../sysdeps/unix/syscall-template.S:82 
82 ../sysdeps/unix/syscall-template.S: Nincs ilyen fájl vagy könyvtár. 

ho ottenuto i nomi delle funzioni nel backtrace, ma non i numeri di riga nel mio codice:

(gdb) bt 
#0 0x00007ffff7b018b0 in __read_nocancel() at ../sysdeps/unix/syscall-template.S:82 
#1 0x00007ffff7a95ff8 in _IO_new_file_underflow (fp=0x7ffff7dd4340) at fileops.c:619 
#2 0x00007ffff7a9703e in _IO_default_uflow (fp=0x7ffff7dd4340) at genops.c:440 
#3 0x00007ffff7a74fb6 in _IO_vfscanf_internal (s=<optimized out>, format=<optimized out>, argptr=0x7fffffffe018, errp=0x0) at vfscanf.c:620 
#4 0x00007ffff7a790bd in __isoc99_scanf (format=<optimized out>) at isoc99_scanf.c:37 
#5 0x000000000040054e in foo() 
#6 0x0000000000400568 in main() 

Cosa è andato storto? Forse è qualcosa con la configurazione?

risposta

15

tuo gdb è troppo vecchio - è necessario un gdb più recente (io uso 7.6) per comprendere le informazioni di debug generato da gcc 4.8.1

+3

Più precisamente, GCC-4.8 usa per impostazione predefinita dwarf4 (http://gcc.gnu.org/gcc-4.8/changes.html), ma il tuo GDB è troppo vecchio per capirlo. Costruisci con '-gdwarf-2' e otterrai i numeri di linea. Oppure aggiorna GDB a un nuovo dalla build di origine. –

+0

Quindi gdb 7.4 è troppo vecchio. – Calmarius

+1

Costruire e installare gdb 7.6 ha risolto il problema. – Calmarius

8

In genere GCC usa il nano come suo principale formato di file di debug, è necessario abilitare il supporto di nani durante la creazione di gcc con il flag --with-dwarf2.

Durante la creazione dell'oggetto compilato è possibile utilizzare -ggdb anziché -g che è una soluzione più specifica ma just for gdb.

+0

Ok, la compilazione. Se funziona, accetterò questo. – Calmarius

+1

In realtà, il problema è il nano - sta usando la vecchia versione di Ubuntu di gdb che non comprende le informazioni di debug generate dall'ultima versione di gcc. –

+0

Sì, l'opzione --with-dwarf2 non risolve il problema. – Calmarius

Problemi correlati