2011-09-02 10 views
21

Estoy tratando de entender cómo funciona el indicador -pg (o -p) al compilar el código C con gcc.¿Cómo funciona la bandera de gcc -pg?

La documentación oficial gcc only states:

-pg
Generar código extra para escribir la información del perfil adecuado para el gprof programa de análisis. Debe usar esta opción al compilar los archivos fuente sobre los que desea información, y también debe usarlos al vincularlos.

Esto realmente me interesa, ya que estoy haciendo una pequeña investigación sobre los perfiles - tratando de elegir la mejor herramienta para el trabajo.

Respuesta

19

Compilar con -pg instrumentos de su código para que gprof informes información detallada, ver gprof's manual, 9.1 Implementation of Profiling

de perfiles funciona cambiando cómo se compila cada función en su programa para que cuando se le llama, será ir acumulando información acerca de dónde fue llamado. A partir de esto, el generador de perfiles puede averiguar qué función lo llamó y puede contar cuántas veces se lo llamó. El compilador realiza este cambio cuando su programa se compila con la opción -pg, que hace que cada función llame al mcount (o _mcount o __mcount, según el sistema operativo y el compilador) como una de sus primeras operaciones.

La rutina mcount, incluida en la biblioteca de creación de perfiles, es responsable de registrar en una tabla de gráficos de llamadas en memoria tanto su rutina primaria (la secundaria) como la primaria de sus padres. Esto normalmente se hace al examinar el marco de pila para encontrar tanto la dirección del niño como la dirección de devolución en el original. Como esta es una operación muy dependiente de la máquina, el mcount suele ser una rutina corta de lenguaje ensamblador que extrae la información requerida, y luego llama al __mcount_internal (una función C normal) con dos argumentos: frompc y selfpc. __mcount_internal es responsable de mantener el gráfico de llamada en memoria, que registra frompc, selfpc, y la cantidad de veces que se atravesó cada uno de estos arcos de llamada.

...

Tenga en cuenta que con un perfilador de tal uso de variables instrumentales, que está perfilado el mismo código que se compilará en libertad sin perfiles de instrumentación. Hay una sobrecarga asociada con el código de instrumentación en sí. Además, el código de instrumentación puede alterar el uso de la instrucción y del caché de datos.

Contrariamente a un perfilador de instrumentos, un perfilador de muestreo como Intel VTune funciona con código no instrumentado mirando el contador de programa del programa de destino a intervalos regulares usando interrupciones del sistema operativo. También puede consultar registros especiales de la CPU para darle aún más información sobre lo que está sucediendo.

Ver también Profilers Instrumenting Vs Sampling

6

This link da una breve explicación de cómo funciona la gprof.

This link ofrece una extensa crítica de la misma. (Consulte mi respuesta a la pregunta archivada.)

+0

He estado haciendo casi todos mis perfiles de velocidad solo usando break y backtrace en gdb desde que los leí. –

+0

@David: Tengo muchos argumentos al respecto, pero lo hice * [este ejemplo] (http://scicomp.stackexchange.com/a/1870/1262) * con él. 700x de aceleración. No digo que la pausa sea bonita, pero nadie ha obtenido un resultado como ese de ninguna otra manera, que yo sepa. –

+0

Mike Dunlavey: desafortunadamente, su segundo enlace ya no está disponible. – duedl0r

0

fuente: http://elinux.org/images/0/0c/Bird-LS-2009-Measuring-function-duration-with-ftrace.pdf

Instrumentación viene en dos formas principales -Tracepoints explícitamente declarados, y Tracepoints implícitos. Los puntos de rastreo explícitos consisten en declaraciones definidas por el desarrollador que especifican la ubicación del punto de seguimiento , e información adicional sobre qué datos se deben recopilar en un sitio de rastreo en particular. Implícitos los puntos de seguimiento se colocan en el código automáticamente mediante el compilador , ya sea debido a los indicadores del compilador o por el desarrollador redefinición de macros de uso común.

Para las funciones del instrumento de manera implícita, cuando el núcleo está configurado para soportar el rastreo función, el sistema de construcción del núcleo añade -pg a las banderas utilizadas con el compilador. Esto hace que el compilador agregue código a el prólogo de cada función, que llama a una rutina especial de ensamblaje llamada mcount. Esta opción del compilador es específicamente diseñada para ser utilizada para perfilar y rastrear propósitos.