GCC -g vs -g3 GDB-Flag: Was ist der Unterschied?

101

Beim Kompilieren von C-Quellcode mit gcc oder Clang verwende ich immer das -gFlag, um Debugging-Informationen für gdb zu generieren.

gcc -g -o helloworld helloworld.c

Mir ist aufgefallen, dass einige Leute -g3stattdessen empfehlen . Was ist der Unterschied zwischen den -gund -g3Flags? Gibt es auch einen Unterschied zwischen -gund -ggdb?

Haziz
quelle
15
Ich bin hierher gekommen, weil ich das Makefile eines anderen benutze und die Dokumentation ein Biest ist, von dem man anfangen kann. Gute Frage zu StackOverflow, um eine einfache Antwort von Google zu finden.
GreenAsJade
Eine überwältigende Anzahl von Fragen zu SO wird "in der Dokumentation behandelt", solange Sie bereit sind, weit genug zu graben. Das ist kein triftiger Grund, eine Frage abzulehnen.
BeeOnRope

Antworten:

103

Aus den Dokumenten :

-G

Erstellen Sie Debugging-Informationen im nativen Format des Betriebssystems (Stabs, COFF, XCOFF oder DWARF 2). GDB kann mit diesen Debugging-Informationen arbeiten. Auf den meisten Systemen, die das Stabs-Format verwenden, ermöglicht -g die Verwendung zusätzlicher Debugging-Informationen, die nur GDB verwenden kann. Diese zusätzlichen Informationen verbessern das Debuggen in GDB, führen jedoch wahrscheinlich dazu, dass andere Debugger abstürzen oder sich weigern, das Programm zu lesen. Wenn Sie sicher steuern möchten, ob die zusätzlichen Informationen generiert werden sollen, verwenden Sie -gstabs +, -gstabs, -gxcoff +, -gxcoff oder -gvms (siehe unten).

...


-ggdb

Erstellen Sie Debugging-Informationen zur Verwendung durch GDB. Dies bedeutet, dass Sie das ausdrucksstärkste verfügbare Format verwenden (DWARF 2, Stabs oder das native Format, wenn keines davon unterstützt wird), einschließlich GDB-Erweiterungen, sofern dies überhaupt möglich ist.


-gvmslevel

Fordern Sie Debugging-Informationen an und geben Sie mithilfe der Ebene an, wie viele Informationen vorhanden sind. Die Standardstufe ist 2. Stufe 0 erzeugt überhaupt keine Debug-Informationen. Somit negiert -g0 -g.

....

Stufe 3 enthält zusätzliche Informationen, wie z. B. alle im Programm enthaltenen Makrodefinitionen. Einige Debugger unterstützen die Makroerweiterung, wenn Sie -g3 verwenden.

MByD
quelle
8
Kann man noch erklären, was der Unterschied zwischen beispielsweise "ausdrucksstärkstem Format" und "zusätzlichen Informationen" ist? Sind diese Parameter komplementär? Viele von ihnen erwähnen GDB ... Danke!
Rogerdpack
27

tl; dr: Um Ihre spezifische Frage zu beantworten, -g3"enthält zusätzliche Informationen wie Makrodefinitionen ... Einige Debugger unterstützen die Makroerweiterung, wenn Sie sie verwenden -g3", während -gdiese zusätzlichen Informationen nicht enthalten sind.

Die umfassendere Antwort lautet, dass gcc vier Ebenen von Debug-Informationen unterstützt, von -g0(Debug-Informationen deaktiviert) bis -g3(maximale Debug-Informationen).

Die Angabe -gentspricht -g2. Seltsamerweise sagen die gcc-Dokumente wenig darüber aus, welche Informationen -g/ -g2enthalten oder ausschließen:

Fordern Sie Debugging-Informationen an und geben Sie mithilfe der Ebene an, wie viele Informationen vorhanden sind. Die Standardstufe ist 2. Stufe 0 erzeugt überhaupt keine Debug-Informationen. Somit negiert -g0 -g.

Stufe 1 erzeugt nur minimale Informationen, genug, um Rückverfolgungen in Teilen des Programms zu erstellen, die Sie nicht debuggen möchten. Dies umfasst Beschreibungen von Funktionen und externen Variablen sowie Zeilennummerntabellen, jedoch keine Informationen zu lokalen Variablen.

Stufe 3 enthält zusätzliche Informationen, wie z. B. alle im Programm enthaltenen Makrodefinitionen. Einige Debugger unterstützen die Makroerweiterung, wenn Sie -g3 verwenden.

U007D
quelle