2013-08-23 8 views
7

と行番号情報を生成しません:GCCは、私が構築され、ソースからGCC 4.8.1インストールしていても-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) 

そして私は、単純な役に立たないプログラム書いた:

$ 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(); 
} 

今、私はこれをコンパイル:

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

が続いて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) 

すぐに実行それとCtrl + Cそれ:間違って何

(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() 

(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. 

私はバックトレースで関数名が、私のコードではありません行番号を得ましたか。多分それは構成と何かですか?

答えて

15

あなたgdbが古すぎる - あなたは、GCC 4.8.1

+3

より正確には、GCC-4.8のデフォルトはdwarf4(http://gcc.gnu.org/gcc-4.8/changes.html)ですが、あなたのGDBはそれを理解するには古すぎます。 '-gdwarf-2'でビルドすると、行番号が戻されます。あるいはソースビルドからGDBをより新しいものに更新してください。 –

+0

gdb 7.4が古すぎます。 – Calmarius

+1

gdb 7.6をビルドしてインストールすると問題が解決しました。 – Calmarius

8

通常、GCCは主なデバッグファイル形式としてdwarfを使用していますので、フラグ--with-dwarf2を使用してgccをビルドする場合、ドワーフサポートを有効にする必要があります。

コンパイルされたオブジェクトを構築する際には、より具体的な解決策である-gの代わりに-ggdbを使用できますが、just for gdbです。

+0

オクラホマによって生成されるデバッグ情報を理解するために、より最近のGDB(私は7.6を使用)、コンパイルを必要としています。それが機能すれば、私はこれを受け入れる。 – Calmarius

+1

実際、dwarfは問題です。彼はUbuntuの古いバージョンのgdbを使用していますが、gccの最新バージョンで生成されたデバッグ情報は理解できません。 –

+0

ええ、--with-dwarf2スイッチは問題を解決しませんでした。 – Calmarius

関連する問題