Wenn ich C-Quellcode entweder mit gcc oder Clang kompiliere, verwende ich immer die -g
Flag zum Generieren von Debugging-Informationen für gdb.
gcc -g -o helloworld helloworld.c
Mir ist aufgefallen, dass einige Leute empfehlen -g3
stattdessen. Was ist der Unterschied zwischen der -g
und -g3
Flaggen? Gibt es auch einen Unterschied zw -g
und -ggdb
?
Von dem Dokumente:
-g
Produzieren 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 aber 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
Erzeugt Debugging-Informationen zur Verwendung durch GDB. Dies bedeutet, das ausdrucksstärkste verfügbare Format zu verwenden (DWARF 2, Stabs oder das native Format, falls keines von beiden unterstützt wird), einschließlich GDB-Erweiterungen, sofern möglich.
-gvmslevel
Fordern Sie Debugging-Informationen an und verwenden Sie auch level, um anzugeben, wie viele Informationen. Die Standardstufe ist 2. Stufe 0 erzeugt überhaupt keine Debug-Informationen. Somit negiert -g0 -g.
….
Ebene 3 enthält zusätzliche Informationen, wie z. B. alle im Programm vorhandenen Makrodefinitionen. Einige Debugger unterstützen die Makroerweiterung, wenn Sie -g3 verwenden.
tl;dr: Um Ihre konkrete Frage zu beantworten, -g3
“enthält zusätzliche Informationen wie Makrodefinitionen … Einige Debugger unterstützen die Makroerweiterung, wenn Sie verwenden -g3
“, während -g
enthält diese zusätzlichen Informationen nicht.
Die breitere Antwort lautet, dass gcc vier Ebenen von Debug-Informationen unterstützt, von -g0
(Debug-Informationen deaktiviert) durch -g3
(maximale Debug-Informationen).
Angabe -g
ist äquivalent zu -g2
. Kurioserweise die gcc-Dokumente sagen wenig darüber, welche Informationen -g
/-g2
schließt ein oder aus:
Fordern Sie Debugging-Informationen an und verwenden Sie auch level, um anzugeben, wie viele Informationen. Die Standardstufe ist 2. Stufe 0 erzeugt überhaupt keine Debug-Informationen. Somit negiert -g0 -g.
Stufe 1 erzeugt minimale Informationen, die ausreichen, um Rückverfolgungen in Teilen des Programms zu erstellen, die Sie nicht debuggen möchten. Dazu gehören Beschreibungen von Funktionen und externen Variablen sowie Zeilennummerntabellen, aber keine Informationen über lokale Variablen.
Ebene 3 enthält zusätzliche Informationen, wie z. B. alle im Programm vorhandenen Makrodefinitionen. Einige Debugger unterstützen die Makroerweiterung, wenn Sie -g3 verwenden.
Ich bin hierher gekommen, weil ich das Makefile von jemand anderem verwende und die Dokumentation ein Monster ist, um damit zu beginnen. Gute Frage zu StackOverflow, um eine einfache Antwort von Google zu finden.
– GreenAsJade
23. September 2015 um 12:11 Uhr
Eine überwältigende Anzahl von Fragen zu SO werden von der Dokumentation abgedeckt, solange Sie bereit sind, weit genug zu graben. Das ist kein triftiger Grund, eine Frage abzulehnen.
– BeeOnRope
3. Oktober 2018 um 22:39 Uhr