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

90

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

Однако я заметил, что некоторые программы используют -ggdb, поскольку это должно сделать информацию отладки более удобной для gdb.

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


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

Йохан
источник

Ответы:

38

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

Луапьяд
источник
Можно было бы подумать о подключении тока, как это происходит?
1737973
60

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

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

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

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

-ggdbсам по себе, без указания уровня по умолчанию -ggdb2(например, gdb для уровня 2).

MRZ
источник
12

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

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)

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


источник
7

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

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

DevSolar
источник