В чем разница между gcc -ggdb и gcc -g

Когда я использую gcc для компиляции программ на C Обычно я использую -g для получения отладочной информации в файле эльфа так что gdb может помочь мне в случае необходимости.

Однако я заметил, что в некоторых программах используется -ggdb, поскольку он должен debug info больше gdb.

Как они отличаются и которые рекомендуется использовать?


Примечание. Ссылка на параметры для отладки вашей программы или GCC, http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

Ответ 1

Возможно, что нет никакой разницы - зависит от собственного формата ОС и от того, насколько портативна информация об отладке. См. Руководство GCC Параметры отладки.

Ответ 2

-g и -ggdb почти схожи с некоторыми небольшими отличиями, я прочитал здесь здесь:

-g создает отладочную информацию в собственном формате OS¹s (stabs, COFF, XCOFF или DWARF 2).

-ggdb создает информацию для отладки, специально предназначенную для gdb.

-ggdb3 создает дополнительную информацию для отладки, например: включая определения макросов. -ggdb сам по себе без указания уровня по умолчанию

-ggdb2 (т.е. gdb для уровня 2).

Ответ 3

У меня, по крайней мере, один пример, где -ggdb работал лучше для меня, чем другой вариант отладки, который мы использовали:

[email protected]:~> 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;
}
[email protected]:~> gcc -gstabs+ main.c -o main

[email protected]:~> 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
[email protected]:~> /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)

Примечание. Это происходит только в блоках x86-64 и исчезает при компиляции с -ggdb. Но более новые версии отладчика работают даже с -gstabs +

Ответ 4

Одно дело, что "-g" является переносимым (например, в Makefiles, предназначенном для выполнения на платформах, отличных от GNU). В последнее время у меня была проблема с переносимостью относительно -g против -ggdb на машине AIX, поэтому я ее выношу.

Не знаю, что -ggdb добавляет в удобство использования.