Was ist der Unterschied zwischen gcc -ggdb und gcc -g


89

Wenn ich gcc zum Kompilieren von C-Programmen verwende, verwende ich normalerweise -geinige Debug-Informationen in die elf-Datei, damit gdb mir bei Bedarf helfen kann.

Ich bemerkte jedoch, dass einige Programme verwenden -ggdb, da dies die Debug-Informationen gdb-freundlicher machen soll.

Wie unterscheiden sie sich und welche wird empfohlen?


Hinweis: Ein Link zu den Optionen zum Debuggen Ihres Programms oder GCC unter http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

Antworten:


37

Es ist möglich, dass es keinen Unterschied gibt - abhängig vom nativen Format des Betriebssystems und davon, wie portabel die Debugging-Informationen sein sollen. Siehe GCC-Handbuch Debugging-Optionen .


Könnte die Verknüpfung betrachten Strom wie dies tut?
1737973

59

-gund -ggdbsind ähnlich mit einigen kleinen Unterschieden, ich lese dies hier :

-g Erzeugt Debugging-Informationen im nativen Format des Betriebssystems (Stabs, COFF, XCOFF oder DWARF 2).

-ggdb erzeugt Debugging-Informationen, die speziell für GDB bestimmt sind.

-ggdb3 erzeugt zusätzliche Debugging-Informationen, zum Beispiel: einschließlich Makrodefinitionen.

-ggdban sich ohne Angabe der Standardeinstellungen der Ebene -ggdb2(dh gdb für Ebene 2).


12

Ich habe mindestens ein Beispiel, in dem -ggdb für mich besser funktioniert hat als eine andere Debug-Option, die wir verwendet haben:

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)

Hinweis: Dies geschieht nur bei x86-64-Boxen und verschwindet beim Kompilieren mit -ggdb. Neuere Versionen des Debuggers funktionieren jedoch auch mit -gstabs +


7

Eine Sache ist, dass "-g" portabel ist (z. B. in Makefiles, die auf Nicht-GNU-Plattformen ausgeführt werden sollen). Ich hatte kürzlich ein Portabilitätsproblem in Bezug auf -g vs. -ggdb auf einem AIX-Computer. Deshalb spreche ich es an.

Keine Ahnung, was -ggdb zur Benutzerfreundlichkeit beiträgt.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.