Flag di GCC -g vs -g3 GDB: qual è la differenza?


102

Quando compilo il codice sorgente C con gcc o Clang, utilizzo sempre il -gflag per generare le informazioni di debug per gdb.

gcc -g -o helloworld helloworld.c

Ho notato che alcune persone consigliano -g3invece. Qual è la differenza tra i flag -ge -g3? Inoltre c'è una differenza tra -ge -ggdb?


15
Sono venuto qui perché sto usando il makefile di qualcun altro e la documentazione è una bestia da cui partire. Bella domanda da avere su StackOverflow per trovare una facile risposta da Google.
GreenAsJade,

Un numero enorme di domande su SO è "coperto dalla mia documentazione" fintanto che sei disposto a scavare abbastanza lontano. Non è un motivo valido per respingere una domanda.
BeeOnRope

Risposte:


104

Dai documenti :

-g

Produci informazioni di debug nel formato nativo del sistema operativo (stabs, COFF, XCOFF o DWARF 2). GDB può lavorare con queste informazioni di debug. Sulla maggior parte dei sistemi che usano il formato stabs, -g abilita l'uso di informazioni di debug extra che solo GDB può usare; questa informazione aggiuntiva fa funzionare meglio il debug in GDB ma probabilmente fa sì che altri debugger si blocchino o si rifiutino di leggere il programma. Se vuoi controllare con certezza se generare le informazioni extra, usa -gstabs +, -gstabs, -gxcoff +, -gxcoff o -gvms (vedi sotto).

...


-ggdb

Produci informazioni di debug per l'utilizzo da parte di GDB. Ciò significa utilizzare il formato più espressivo disponibile (DWARF 2, stabs o il formato nativo se nessuno di questi è supportato), comprese le estensioni GDB se possibile.


-gvmslevel

Richiedi informazioni di debug e utilizza anche il livello per specificare la quantità di informazioni. Il livello predefinito è 2. Il livello 0 non produce alcuna informazione di debug. Quindi, -g0 nega -g.

....

Il livello 3 include informazioni extra, come tutte le definizioni macro presenti nel programma. Alcuni debugger supportano l'espansione delle macro quando si utilizza -g3.


8
È possibile spiegare ancora qual è la differenza tra, ad esempio, "formato più espressivo" e "informazioni extra"? Questi parametri sono complementari? Molti di loro menzionano GDB ... Grazie!
Rogerdpack

28

tl; dr: per rispondere alla tua domanda specifica, -g3"include informazioni extra come le definizioni delle macro ... Alcuni debugger supportano l'espansione delle macro quando usi -g3", mentre -gnon include queste informazioni extra.

La risposta più ampia è che gcc supporta quattro livelli di informazioni di debug, da -g0(informazioni di debug disabilitate) a -g3(informazioni di debug massime).

La specifica -gè equivalente a -g2. Curiosamente, i documenti di gcc dicono poco su quali informazioni -g/ -g2includono o escludono:

Richiedi informazioni di debug e utilizza anche il livello per specificare la quantità di informazioni. Il livello predefinito è 2. Il livello 0 non produce alcuna informazione di debug. Quindi, -g0 nega -g.

Il livello 1 produce informazioni minime, sufficienti per creare backtrace in parti del programma di cui non si prevede di eseguire il debug. Ciò include descrizioni di funzioni e variabili esterne e tabelle dei numeri di riga, ma nessuna informazione sulle variabili locali.

Il livello 3 include informazioni extra, come tutte le definizioni macro presenti nel programma. Alcuni debugger supportano l'espansione delle macro quando si utilizza -g3.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.