Sự khác biệt giữa gcc -ggdb và gcc -g là gì


90

Khi tôi sử dụng gcc để biên dịch các chương trình C, tôi thường sử dụng -gđể lấy một số thông tin gỡ lỗi vào tệp elf để gdb có thể giúp tôi nếu cần.

Tuy nhiên, tôi nhận thấy rằng một số chương trình sử dụng -ggdb, vì nó phải làm cho thông tin gỡ lỗi thân thiện hơn với gdb.

Chúng khác nhau như thế nào và loại nào được khuyến khích sử dụng?


Lưu ý: Liên kết đến các tùy chọn để gỡ lỗi chương trình của bạn hoặc GCC, http://gcc.gnu.org/onlineocs/gcc/Debugging-Options.html#Debugging-Options

Câu trả lời:



60

-g-ggdbtương tự với một số khác biệt nhỏ , tôi đọc điều này ở đây :

-g tạo thông tin gỡ lỗi ở định dạng gốc của OS¹ (stt, COFF, XCOFF hoặc DWARF 2).

-ggdb tạo ra thông tin gỡ lỗi dành riêng cho gdb.

-ggdb3 tạo thêm thông tin gỡ lỗi, ví dụ: bao gồm các định nghĩa macro.

-ggdbcủa chính nó mà không chỉ định mức mặc định -ggdb2là (tức là gdb cho mức 2).


12

Tôi có ít nhất một ví dụ trong đó -ggdb hoạt động tốt hơn cho tôi so với một tùy chọn gỡ lỗi khác mà chúng tôi đang sử dụng:

amitkar@lohgad:~> cat > main.c
#include <stdio.h>

int main(int argc, char **argv)
{
        printf("Args :%d\n", argc);
        for ( ;argc > 0;)
                printf("%s\n", argv[--argc]);

        return 0;
}
amitkar@lohgad:~> gcc -gstabs+ main.c -o main

amitkar@lohgad:~> file main
main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped
amitkar@lohgad:~> /usr/bin/gdb ./main
GNU gdb 6.6.50.20070726-cvs
Copyright (C) 2007 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-suse-linux"...
Using host libthread_db library "/lib64/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x400577: file main.c, line 5.
(gdb) run
Starting program: /home/amitkar/main

Breakpoint 1, main (argc=Cannot access memory at address 0x8000df37d57c
) at main.c:5
5               printf("Args :%d\n", argc);
(gdb) print argc
Cannot access memory at address 0x8000df37d57c
(gdb)

Lưu ý: Điều này chỉ xảy ra trên các hộp x86-64 và biến mất khi được biên dịch với -ggdb. Nhưng các phiên bản mới hơn của trình gỡ lỗi vẫn hoạt động ngay cả với -gstabs +


7

Một điều là "-g" có tính di động (ví dụ như trong Makefiles được thực thi trên các nền tảng không phải GNU). Gần đây, tôi đã gặp vấn đề về tính di động liên quan đến -g so với -ggdb trên máy AIX, đó là lý do tại sao tôi đưa ra.

Tuy nhiên, không có ý tưởng về những gì -ggdb thêm vào khả năng sử dụng.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.