Pregunta

Al escribir 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 al ejecutable binario?¿Qué datos adicionales se almacenan en el archivo que permite que el depurador funcione como lo hace?

¿Fue útil?

Solución

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

  • nombres de símbolos
  • escriba información para los símbolos
  • archivos y números de línea de donde provienen los símbolos

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

Para algunos compiladores, proporcionar -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 proporciona -O[123], las optimizaciones que impiden el seguimiento de la pila seguirán deshabilitadas (p. ej.Eliminación de punteros de marco de marcos de pila.Esto sólo tiene un efecto menor en el rendimiento).

Con algunos compiladores, -g deshabilitará las optimizaciones que pueden confundir de dónde provienen los símbolos (reordenamiento de instrucciones, desenrollado de bucles, inserción en línea, etc.).Si desea depurar con optimización, puede usar -g3 con gcc para solucionar algo de esto.Se incluirá información de depuración adicional sobre macros, expansiones y funciones que pueden haberse incluido.Esto puede permitir que los depuradores y las herramientas de rendimiento asigne el código optimizado a la fuente original, pero es el mejor esfuerzo.Algunas optimizaciones realmente alteran el código.

Para más información, echa un vistazo a ENANO, el formato de depuración diseñado originalmente para acompañar a ELF (el formato binario para Linux y otros sistemas operativos).

Otros consejos

Se agrega una tabla de símbolos al ejecutable que asigna nombres de funciones/variables a 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'.

Además de la información de depuración y símbolos
Google DWARF (una broma de desarrollador sobre ELF)

De forma predeterminada, la mayoría de las optimizaciones del compilador están desactivadas cuando la depuración está habilitada.
Por lo tanto, el código es la traducción pura del código fuente a código de máquina en lugar del resultado de muchas transformaciones altamente especializadas que se aplican para liberar archivos binarios.

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

Consulte la documentación de su compilador para obtener más información:
Pero un ejemplo para DevStudio es:

  • 0xCDCDCDCD Asignado en el montón, pero no inicializado
  • 0xDDDDDDDD Memoria de montón liberada.
  • 0xFDFDFDFD Las vallas "NoMansLand" se colocan automáticamente en el límite de la memoria del montón.Nunca debe sobrescribirse.Si sobrescribe uno, probablemente se esté saliendo del final de una matriz.
  • 0xCCCCCCCC Asignado en la pila, pero no inicializado

-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 usar -g junto con los indicadores -O, que activan la optimización.Depurar un ejecutable optimizado puede ser muy complicado, porque las variables pueden optimizarse o las instrucciones pueden ejecutarse en un orden diferente.Generalmente, es una buena idea desactivar la optimización cuando se usa -g, aunque resulte en un código mucho más lento.

Hay cierta superposición con esto. pregunta que cubre el tema desde el otro lado.

Solo como cuestión de interés, puedes abrir un editor hexadecimal y echar un vistazo a un ejecutable producido con -g y uno sin.Puedes ver los símbolos y las cosas que se agregan.Puede cambiar el conjunto (-S) también, pero no estoy seguro.

Algunos sistemas operativos (como z/OS) produce un "archivo lateral" que contiene los símbolos de depuración.Esto ayuda a evitar sobrecargar el ejecutable con información adicional.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top