2013-08-23 29 views
7

tôi đã xây dựng và lắp đặt GCC 4.8.1 từ source:GCC không tạo ra thông tin số dòng ngay cả với tùy chọn -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) 

Và tôi đã viết một chương trình vô dụng đơn giản:

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

Bây giờ tôi biên dịch này:

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

Sau đó, bắt đầu gỡ lỗi nó với 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) 

Chạy nó và Ctrl + C nó ngay lập tức:

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

tôi tên hàm trong backtrace nhưng không có số dòng trong mã của tôi:

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

gì đi sai? Có lẽ nó là một cái gì đó với cấu hình?

Trả lời

15

gdb của bạn quá cũ - bạn cần gdb gần đây hơn (tôi sử dụng 7.6) để hiểu thông tin gỡ lỗi được tạo bởi gcc 4.8.1

+3

Chính xác hơn, GCC-4.8 mặc định sử dụng dwarf4 (http://gcc.gnu.org/gcc-4.8/changes.html), nhưng GDB của bạn quá cũ để hiểu điều đó. Xây dựng với '-gdwarf-2' và bạn sẽ lấy lại số dòng của mình. Hoặc cập nhật GDB thành phiên bản mới hơn từ bản dựng nguồn. –

+0

Vì vậy, gdb 7.4 quá cũ. – Calmarius

+1

Xây dựng và cài đặt gdb 7.6 giải quyết được sự cố. – Calmarius

8

Thông thường GCC sử dụng sao lùn làm định dạng tệp gỡ lỗi chính, bạn cần bật hỗ trợ lùn khi xây dựng gcc với cờ --with-dwarf2.

Khi xây dựng đối tượng được biên dịch, bạn có thể sử dụng -ggdb thay vì -g là giải pháp cụ thể hơn nhưng just for gdb.

+0

Ok, biên dịch. Nếu nó hoạt động, tôi sẽ chấp nhận điều này. – Calmarius

+1

Trên thực tế, lùn là vấn đề - anh ấy đang sử dụng phiên bản gdb cũ của Ubuntu không hiểu thông tin gỡ lỗi được tạo bởi phiên bản gcc mới nhất. –

+0

Vâng, công tắc --with-dwarf2 không giải quyết được vấn đề. – Calmarius

Các vấn đề liên quan