Lorsque j'utilise gcc pour compiler des programmes C, j'utilise généralement -g
pour 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 utilisent -ggdb
, car il est censé rendre les informations de débogage plus conviviales pour gdb.
En quoi diffèrent-ils et lequel est 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
Il est possible qu'il n'y ait pas de différence - cela dépend du format natif du système d'exploitation et de la portabilité des informations de débogage. Voir le manuel GCC Options de débogage .
-g
et -ggdb
sont presque 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 les définitions de macro. -ggdb par lui-même sans spécifier le niveau par défaut à
-ggdb2 (c'est-à-dire, gdb pour le niveau 2).
J'ai au moins un exemple où -ggdb a mieux fonctionné 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îtes x86-64 et disparaît lorsqu'il est compilé avec -ggdb. Mais les nouvelles versions du débogueur fonctionnent même avec -gstabs +
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 contre -ggdb sur une machine AIX récemment, c'est pourquoi je le soulève.
Aucune idée de ce que -ggdb ajoute en termes de convivialité, cependant.
Voici l'explication officielle: http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
Seulement quelques faits concrets, mais quand même intéressants.