2011-05-09 10 views
34

Si el tamaño del archivo binario no es un problema, ¿hay algún inconveniente al usar g y no eliminar los binarios que se ejecutarán en un entorno de rendimiento crítico? Tengo mucho espacio en disco, pero el binario requiere mucha CPU y usa mucha memoria. El binario se carga una vez y está vivo durante varias horas.gcc -g vs not -g and strip vs not strip, performance and memory use?

EDIT:

La razón por la que quiero usar binarios con información de depuración es útil para generar volcados de memoria en caso de fallos de segmentación.

+0

Creo que la cuestión se reduce a si los símbolos se cargan en memoria de forma predeterminada o no. Si lo son, esto contribuiría al tiempo de carga y al consumo de memoria. Pregunta interesante, esperando respuestas. +1 – 0xC0000022L

+0

¿Por qué no intentar hacer ambas cosas? –

+0

@unapersson: Es difícil hacer tales pruebas en nuestro entorno, ya que el rendimiento depende en gran medida de factores externos que varían rápidamente. – Johan

Respuesta

30

El cargador ELF carga segmentos, no secciones; el mapeo de secciones a segmentos está determinado por el script del enlazador utilizado para construir el ejecutable.

El script del enlazador predeterminado no correlaciona las secciones de depuración con ningún segmento, por lo que se omite.

La información del símbolo tiene dos formas: los símbolos estáticos se procesan fuera de banda y nunca se guardan como datos de sección; El vinculador genera tablas de símbolos dinámicos y se agrega a un segmento especial que se carga junto con el ejecutable, ya que debe ser accesible para el vinculador dinámico. El comando strip solo elimina los símbolos estáticos, que de todos modos no se referencian en ningún segmento.

Por lo tanto, puede utilizar la información completa de depuración durante todo el proceso, y esto no afectará el tamaño de la imagen ejecutable en la RAM, ya que no está cargada. Esto también significa que la información no está incluida en los volcados centrales, por lo que tampoco le brinda ningún beneficio aquí.

La utilidad objcopy tiene una opción especial para copiar solo la información de depuración, por lo que puede generar un segundo archivo ELF que contenga esta información y usar binarios eliminados; al analizar el volcado de memoria, a continuación, puede cargar ambos archivos en el depurador:

objcopy --only-keep-debug myprogram myprogram.debug 
strip myprogram 
+0

¡Gracias por esta explicación detallada! Para verificar que entendí correctamente ... Un archivo binario creado con -g se ejecutará tan rápido como uno que está desmantelado (creado a partir del mismo código fuente), y ambos generarán el mismo volcado de núcleo en caso de una falla de segmentación. – Johan

+0

Exactamente. Además, al eliminar un archivo binario, se elimina la información que -g generó/conserva, más un poco más, por lo que el resultado después del stripping debería ser idéntico ya sea que haya compilado o no con -g. –