GCC -g vs -g3 GDB Flag: ¿Cuál es la diferencia?

102

Al compilar el código fuente de C con gcc o Clang, siempre uso la -gbandera para generar información de depuración para gdb.

gcc -g -o helloworld helloworld.c

Me di cuenta de que algunas personas recomiendan en su -g3lugar. ¿Cuál es la diferencia entre las banderas -gy -g3? ¿También hay una diferencia entre -gy -ggdb?

haziz
fuente
15
Vine aquí porque estoy usando el archivo MAKE de otra persona, y la documentación es una bestia para comenzar. Buena pregunta en StackOverflow para encontrar una respuesta fácil de Google.
GreenAsJade
Una abrumadora cantidad de preguntas sobre SO están "cubiertas por la documentación" siempre que esté dispuesto a profundizar lo suficiente. Esa no es una razón válida para descartar una pregunta.
BeeOnRope

Respuestas:

104

De los documentos :

-gramo

Produzca información de depuración en el formato nativo del sistema operativo (puñaladas, COFF, XCOFF o DWARF 2). GDB puede trabajar con esta información de depuración. En la mayoría de los sistemas que utilizan el formato Stabs, -g habilita el uso de información de depuración adicional que solo GDB puede utilizar; esta información adicional hace que la depuración funcione mejor en GDB pero probablemente haga que otros depuradores se bloqueen o se nieguen a leer el programa. Si desea controlar con certeza si generar la información adicional, use -gstabs +, -gstabs, -gxcoff +, -gxcoff o -gvms (ver más abajo).

...


-ggdb

Genere información de depuración para que la utilice GDB. Esto significa utilizar el formato más expresivo disponible (DWARF 2, puñaladas o el formato nativo si ninguno de ellos es compatible), incluidas las extensiones de GDB si es posible.


-gvmslevel

Solicite información de depuración y también use el nivel para especificar cuánta información. El nivel predeterminado es 2. El nivel 0 no produce ninguna información de depuración. Por tanto, -g0 niega -g.

....

El nivel 3 incluye información adicional, como todas las definiciones de macro presentes en el programa. Algunos depuradores admiten la expansión de macros cuando usa -g3.

MByD
fuente
8
¿Es posible explicar todavía cuál es la diferencia entre, por ejemplo, "formato más expresivo" e "información extra"? ¿Son estos parámetros complementarios? Muchos de ellos mencionan GDB ... ¡Gracias!
rogerdpack
28

tl; dr: Para responder a su pregunta específica, -g3"incluye información adicional como definiciones de macros ... Algunos depuradores admiten la expansión de macros cuando se utiliza -g3", mientras -gque no incluye esta información adicional.

La respuesta más amplia es que gcc admite cuatro niveles de información de depuración, desde -g0(información de depuración desactivada) hasta -g3(información de depuración máxima).

Especificar -ges equivalente a -g2. Curiosamente, los documentos de gcc dicen poco sobre qué información -g/ -g2incluye o excluye:

Solicite información de depuración y también use el nivel para especificar cuánta información. El nivel predeterminado es 2. El nivel 0 no produce ninguna información de depuración. Por tanto, -g0 niega -g.

El nivel 1 produce información mínima, suficiente para realizar rastreos en partes del programa que no planea depurar. Esto incluye descripciones de funciones y variables externas y tablas de números de línea, pero no información sobre variables locales.

El nivel 3 incluye información adicional, como todas las definiciones de macro presentes en el programa. Algunos depuradores admiten la expansión de macros cuando usa -g3.

U007D
fuente