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
-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).
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'.
Hay alguna superposición con este question que cubre el problema desde el otro lado.
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.
-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.
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
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.
- 1. ¿Cómo compilar boost con la bandera de depuración -g?
- 2. ¿Cómo funciona la depuración en Visual Studio?
- 3. La opción -g de g ++ es equivalente al compilador VS2010 cl?
- 4. símbolos de depuración de gcc (indicador -g) vs opción -rdinámica del vinculador
- 5. ¿Cómo funciona la depuración inversa?
- 6. ¿Qué hace la opción -lm en g ++?
- 7. ¿Cuál es tu opción favorita de g ++?
- 8. Averiguar el indicador de optimización de compilación desde el ejecutable
- 9. ¿Puedo depurar un núcleo binario generado por un C++ y sin símbolos de depuración utilizando el mismo binario volver a compilar con símbolos de depuración
- 10. ¿Cómo funciona realmente la opción make "-j"?
- 11. g ++ funciona, pero no "g ++ -c" y ld
- 12. -fPIE ("ejecutable independiente de la posición) opción (gcc, ld)
- 13. cómo cambiar el valor NSString durante la depuración en XCode?
- 14. bash: opción de depuración y las funciones
- 15. Incrustar un ejecutable binario en un script de shell
- 16. ¿Cómo cambiar la "fuente asociada" de Eclipse para la depuración?
- 17. ¿Cuál es la diferencia entre el formato binario simple (.bin) y el ejecutable de Windows (.exe)?
- 18. ¿Cómo cambiar el icono del archivo jar ejecutable?
- 19. Cambiar la imagen de fondo con el botón de opción
- 20. Depuración remota de Java, ¿cómo funciona técnicamente?
- 21. ¿Cómo funciona la opción "Solicitar sitio de escritorio" de Chrome?
- 22. sed -i opción no funciona en solaris
- 23. Cambiar el color de la opción seleccionada solo
- 24. ¿Cómo funciona el tipo de opción en F #
- 25. ¿Cómo cambiar el icono ejecutable desde el código C#? (no es mi icono de la aplicación)
- 26. Depuración-> Falta la opción de excepciones en VS2010
- 27. Cambiar el nombre del botón de opción javascript no funciona en IE
- 28. Conexión de depuración Eclipse CDT al proceso - no en formato ejecutable: Formato de archivo no reconocido
- 29. g ++ - ¿está usando la bandera "-g" para las construcciones de producción una buena idea?
- 30. jqGrid y la opción de auto ancho. ¿Como funciona?
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
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
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