Quelle est la différence entre gcc -ggdb et gcc -g

90

Lorsque j'utilise gcc pour compiler des programmes C, j'utilise habituellement -gpour obtenir des informations de débogage dans le fichier elf afin que gdb puisse m'aider si nécessaire.

Cependant, j'ai remarqué que certains programmes l'utilisent -ggdb, car ils sont censés rendre les informations de débogage plus conviviales pour gdb.

En quoi diffèrent-ils et lequel est-il recommandé d'utiliser?


Remarque: un lien vers les options de débogage de votre programme ou GCC, http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

Johan
la source

Réponses:

38

Il est possible qu'il n'y ait aucune différence - cela dépend du format natif du système d'exploitation et de la portabilité que vous souhaitez que les informations de débogage soient. Voir les options de débogage du manuel GCC .

luapyad
la source
Pourrait envisager de relier le courant comme cela ?
1737973
60

-get -ggdbsont similaires avec quelques légères différences, je lis ceci ici :

-g produit des informations de débogage au format natif du système d'exploitation (stabs, COFF, XCOFF ou DWARF 2).

-ggdb produit des informations de débogage spécifiquement destinées à gdb.

-ggdb3 produit des informations de débogage supplémentaires, par exemple: y compris des définitions de macro.

-ggdbpar lui-même sans spécifier le niveau par défaut -ggdb2(c'est- à -dire gdb pour le niveau 2).

mrz
la source
12

J'ai au moins un exemple où -ggdb fonctionnait mieux pour moi qu'une autre option de débogage que nous utilisions:

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)

Remarque: cela se produit uniquement sur les boîtiers x86-64 et disparaît une fois compilé avec -ggdb. Mais les nouvelles versions du débogueur fonctionnent même avec -gstabs +


la source
7

Une chose est que "-g" est portable (par exemple dans les Makefiles destinés à être exécutés sur des plates-formes non GNU). J'ai eu un problème de portabilité concernant -g par rapport à -ggdb sur une machine AIX récemment, c'est pourquoi j'en parle.

Aucune idée de ce que -ggdb ajoute à la convivialité, cependant.

DevSolar
la source