Cuál es la diferencia entre gcc-ggdb y gcc-g
(5)
Cuando uso gcc para compilar programas C usualmente uso -g
para obtener información de depuración en el archivo elf para que gdb pueda ayudarme si es necesario.
Sin embargo, noté que algunos programas usan -ggdb
, ya que se supone que hace que la información de depuración sea más amigable con gdb.
¿Cómo difieren y cuál se recomienda usar?
Nota: Un enlace a las opciones para depurar su programa o GCC, http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
Es posible que no haya diferencia, depende del formato nativo del sistema operativo y qué tan portátil desea que sea la información de depuración. Ver Opciones de depuración manual de GCC.
Esta es la explicación oficial: http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
Solo unos pocos hechos duros, pero interesantes de todos modos.
Tengo al menos un ejemplo en el que -ggdb funcionó mejor para mí que otra opción de depuración que estábamos usando:
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)
Nota: Esto ocurre solo en los cuadros x86-64 y desaparece cuando se compila con -ggdb. Pero las versiones más nuevas del depurador funcionan incluso con -gstabs +
Una cosa es que "-g" es portable (por ejemplo, en Makefiles destinados a ejecutarse en plataformas que no son de GNU). Hace poco tuve un problema de portabilidad con respecto a -g vs. -ggdb en una máquina AIX, por eso lo menciono.
Sin embargo, no tengo idea de qué -ggdb agrega en usabilidad.
-g
y -ggdb
son casi similares con algunas pequeñas diferencias, lo leí here :
-g produce información de depuración en el formato nativo del sistema operativo (stabs, COFF, XCOFF o DWARF 2).
-ggdb produce información de depuración específicamente diseñada para gdb.
-ggdb3 produce información de depuración adicional, por ejemplo: incluidas las definiciones de macro. -ggdb por sí mismo sin especificar el nivel predeterminado de
-ggdb2 (es decir, gdb para el nivel 2).