Jaka jest różnica między gcc -ggdb i gcc -g

90

Kiedy używam gcc do kompilowania programów w C, zwykle używam -gdo pobierania informacji debugowania do pliku elf, aby gdb mógł mi pomóc w razie potrzeby.

Jednak zauważyłem, że niektóre programy używają -ggdb, ponieważ ma to na celu uczynienie informacji debugowania bardziej przyjaznymi dla gdb.

Czym się różnią i co jest zalecane?


Uwaga: łącze do opcji debugowania programu lub GCC, http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

Johan
źródło

Odpowiedzi:

38

Możliwe, że nie ma różnicy - zależy od natywnego formatu systemu operacyjnego i tego, jak przenośne mają być informacje o debugowaniu. Zobacz podręcznik GCC Opcje debugowania .

luapyad
źródło
Może rozważyć łączenie prądu jak to robi?
1737973
60

-gi -ggdbsą podobne z niewielkimi różnicami, czytam to tutaj :

-g tworzy informacje debugowania w rodzimym formacie OS (stabs, COFF, XCOFF lub DWARF 2).

-ggdb tworzy informacje debugowania przeznaczone specjalnie dla gdb.

-ggdb3 generuje dodatkowe informacje debugowania, na przykład: w tym definicje makr.

-ggdbsamodzielnie bez określania poziomu domyślnie -ggdb2(tj. gdb dla poziomu 2).

mrz
źródło
12

Mam przynajmniej jeden przykład, w którym -ggdb działało lepiej dla mnie niż inna opcja debugowania, której używaliśmy:

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)

Uwaga: Dzieje się to tylko na komputerach x86-64 i znika po kompilacji z -ggdb. Ale nowsze wersje debuggera działają nawet z -gstabs +


źródło
7

Jedną rzeczą jest to, że "-g" jest przenośne (np. W plikach Makefile przeznaczonych do uruchamiania na platformach innych niż GNU). Miałem ostatnio problem z przenośnością dotyczący -g kontra -ggdb na maszynie z systemem AIX, dlatego o tym wspominam.

Nie mam jednak pojęcia, co -ggdb dodaje do użyteczności.

DevSolar
źródło