2008-09-18 6 views
56

Al escribir el código C/C++, para depurar el ejecutable binario, la opción de depuración debe estar habilitada en el compilador/enlazador. En el caso de GCC, la opción es -g. Cuando la opción de depuración está habilitada, ¿cómo afecta el ejecutable binario? ¿Qué datos adicionales se almacenan en el archivo que permiten la función de depuración como lo hace?¿Cómo funciona la opción de depuración -g Cambiar el ejecutable binario?

Respuesta

53

-g le dice al compilador que almacene la información de la tabla de símbolos en el ejecutable. Entre otras cosas, esto incluye:

  • nombres de símbolos
  • información de tipo de símbolos
  • archivos y números de línea donde los símbolos vino de

depuradores utilizan esta información para nombres significativos de salida para símbolos y asociar instrucciones con líneas particulares en la fuente.

Para algunos compiladores, el suministro de -g deshabilitará ciertas optimizaciones. Por ejemplo, icc establece el nivel de optimización predeterminado en -O0 con -g a menos que indique explícitamente -O [123]. Además, incluso si suministras -O [123], las optimizaciones que evitan el seguimiento de la pila seguirán desactivadas (por ejemplo, eliminando los punteros de los marcos de la pila, lo que tiene un efecto menor en el rendimiento).

Con algunos compiladores, -g deshabilitará optimizaciones que pueden confundir el origen de los símbolos (reordenamiento de instrucciones, desenrollado de bucles, alineación, etc.). Si desea depurar con optimización, puede usar -g3 con gcc para evitar algo de esto. Se incluirá información adicional de depuración sobre macros, expansiones y funciones que pueden haber sido inlineadas. Esto puede permitir que los depuradores y las herramientas de rendimiento asocien el código optimizado a la fuente original, pero es el mejor esfuerzo. Algunas optimizaciones realmente destruyen el código.

Para obtener más información, consulte DWARF, el formato de depuración originalmente diseñado para ir junto con ELF (el formato binario para Linux y otros sistemas operativos).

+1

Solo para agregar a esto, también puede ralentizar el ejecutable. Estaba probando algunos códigos OpenMP con el compilador Sun Studio, y con la información de depuración, el código corría mucho más lento. Solo algo a tener en cuenta. – Mike

+4

A menos que el indicador -g en el compilador de Sun inhabilite algunas optimizaciones, la información de depuración NO debería ralentizar su código. – tgamblin

+0

Este es código OpenMP, y lo ralentizó. Estaba jugando con fractales y trabajando en el uso de las extensiones del compilador OpenMP. El código en un solo hilo, corrió más lento que el código no OpenMP en un solo hilo. Inhabilité la depuración y la velocidad se igualó. – Mike

7

Se agrega una tabla de símbolos al ejecutable que correlaciona los nombres de funciones/variables con las ubicaciones de datos, de modo que los depuradores puedan informar información significativa, en lugar de solo punteros. Esto no afecta la velocidad de su programa, y ​​puede eliminar la tabla de símbolos con el comando 'strip'.

3

Hay alguna superposición con este question que cubre el problema desde el otro lado.

3

Solo como una cuestión de interés, puede descifrar un editor hexadecimal y echar un vistazo a un ejecutable producido con -g y uno sin. Puedes ver los símbolos y cosas que se agregan. También puede cambiar el ensamblaje (-S), pero no estoy seguro.

6

-g agrega información de depuración en el ejecutable, como los nombres de las variables, los nombres de las funciones y los números de línea. Esto permite que un depurador, como gdb, recorra el código línea por línea, establezca puntos de interrupción e inspeccione los valores de las variables. Debido a esta información adicional, el uso de -g aumenta el tamaño del ejecutable.

Además, gcc permite utilizar -g junto con -O flags, que activan la optimización. La depuración de un archivo ejecutable optimizado puede ser muy complicado, ya que las variables pueden optimizarse o las instrucciones se pueden ejecutar en un orden diferente. En general, es una buena idea desactivar la optimización cuando se usa -g, aunque se obtenga un código mucho más lento.

8

Además de la información de depuración y el símbolo
Google enano (Una broma Developer en ELF)

Por defecto la mayoría de las optimizaciones del compilador se desactivan cuando está habilitada la depuración.
Por lo tanto, el código es la traducción pura de la fuente en Código máquina en lugar del resultado de muchas transformaciones altamente especializadas que se aplican a los archivos binarios de la versión.

Pero la diferencia más importante (en mi opinión)
La memoria en compilaciones de depuración generalmente se inicializa a algunos valores específicos del compilador para facilitar la depuración. En las compilaciones de versiones, la memoria no se inicializa, a menos que lo haga explícitamente el código de la aplicación.

consultar la documentación del compilador para obtener más información:
Pero un ejemplo para DevStudio es:

  • 0xCDCDCDCD numerado en el montón, pero no inicializado
  • 0xDDDDDDDD memoria del montón Liberado.
  • 0xFDFDFDFD Las vallas "NoMansLand" se colocan automáticamente en el límite de la memoria del montón. Nunca debe ser sobrescrito. Si sobrescribe uno, probablemente esté caminando al final de una matriz.
  • 0xCCCCCCCC numerado en la pila, pero no inicializado
3

Algunos sistemas operativos (como z/OS) producen un "archivo de lado" que contiene los símbolos de depuración. Esto ayuda a evitar la hinchazón del ejecutable con información adicional.

Cuestiones relacionadas