GCC -g kontra -g3 Flaga GDB: jaka jest różnica?

102

Podczas kompilowania kodu źródłowego C za pomocą gcc lub Clang, zawsze używam -gflagi do generowania informacji debugowania dla gdb.

gcc -g -o helloworld helloworld.c

Zauważyłem, że niektórzy -g3zamiast tego polecają . Jaka jest różnica między flagami -gi -g3? Czy jest też różnica między -gi -ggdb?

haziz
źródło
15
Przyszedłem tutaj, ponieważ używam makefile kogoś innego, a dokumentacja to bestia, od której można zacząć. Dobre pytanie na StackOverflow, aby znaleźć łatwą odpowiedź od Google.
GreenAsJade
Przytłaczająca liczba pytań dotyczących SO jest „objętych moją dokumentacją”, o ile tylko zechcesz zagłębić się wystarczająco daleko. To nie jest ważny powód, aby odrzucić pytanie.
BeeOnRope

Odpowiedzi:

104

Z dokumentów :

-sol

Twórz informacje debugowania w rodzimym formacie systemu operacyjnego (stabs, COFF, XCOFF lub DWARF 2). GDB może pracować z tymi informacjami debugowania. W większości systemów, które używają formatu stabs, -g umożliwia użycie dodatkowych informacji debugowania, których może używać tylko GDB; ta dodatkowa informacja sprawia, że ​​debugowanie działa lepiej w GDB, ale prawdopodobnie powoduje awarię innych debuggerów lub odmowę odczytu programu. Jeśli chcesz mieć pewność, czy generować dodatkowe informacje, użyj -gstabs +, -gstabs, -gxcoff +, -gxcoff lub -gvms (patrz poniżej).

...


-ggdb

Utwórz informacje debugowania do użytku przez GDB. Oznacza to użycie najbardziej wyrazistego dostępnego formatu (DWARF 2, stabs lub formatu natywnego, jeśli żaden z nich nie jest obsługiwany), w tym rozszerzeń GDB, jeśli jest to w ogóle możliwe.


-gvmslevel

Poproś o informacje dotyczące debugowania, a także użyj poziomu, aby określić, ile informacji. Poziom domyślny to 2. Poziom 0 nie generuje żadnych informacji debugowania. Zatem -g0 neguje -g.

....

Poziom 3 zawiera dodatkowe informacje, takie jak wszystkie definicje makr obecne w programie. Niektóre debuggery obsługują rozwijanie makr, gdy używasz -g3.

MByD
źródło
8
Czy można jeszcze wyjaśnić, jaka jest różnica między np. „Najbardziej wyrazistym formatem” a „dodatkowymi informacjami”? Czy te parametry są uzupełniające? Wielu z nich wspomina o GDB ... Dzięki!
rogerdpack
28

tl; dr: Aby odpowiedzieć na Twoje konkretne pytanie, -g3„zawiera dodatkowe informacje, takie jak definicje makr ... Niektóre debugery obsługują rozwijanie makr, gdy używasz -g3”, -gale nie zawierają tych dodatkowych informacji.

Szersza odpowiedź jest taka, że ​​gcc obsługuje cztery poziomy informacji debugowania, od -g0(informacje debugowania wyłączone) do -g3(maksymalne informacje debugowania).

Określanie -gjest równoważne z -g2. Co ciekawe, dokumentacja gcc niewiele mówi o tym, jakie informacje -g/ -g2zawierają lub wykluczają:

Poproś o informacje dotyczące debugowania, a także użyj poziomu, aby określić, ile informacji. Poziom domyślny to 2. Poziom 0 nie generuje żadnych informacji debugowania. Zatem -g0 neguje -g.

Poziom 1 generuje minimalne informacje, wystarczające do wykonania śledzenia wstecznego w częściach programu, których nie planujesz debugować. Obejmuje to opisy funkcji i zmiennych zewnętrznych oraz tabele numerów wierszy, ale nie zawiera informacji o zmiennych lokalnych.

Poziom 3 zawiera dodatkowe informacje, takie jak wszystkie definicje makr obecne w programie. Niektóre debuggery obsługują rozwijanie makr, gdy używasz -g3.

U007D
źródło