¿Cómo funciona gcc''s-pg flag?
compilation gprof (3)
Compilar con -pg
instrumentos su código para que gprof
-pg
información detallada, consulte el manual de gprof, 9.1 Implementación de perfiles
La creación de perfiles funciona al cambiar la forma en que se compila cada función en su programa para que cuando se llame, se esconda alguna información sobre desde dónde se llamó. A partir de esto, el generador de perfiles puede averiguar qué función lo llamó, y puede contar cuántas veces se llamó. Este cambio lo realiza el compilador cuando su programa se compila con la opción
-pg
, lo que hace que cada función llame amcount
(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 perfiles, es responsable de registrar en una tabla de gráficos de llamadas en memoria, tanto su rutina primaria (la secundaria) como la principal de la primaria. Esto generalmente se hace al examinar el marco de la pila para encontrar tanto la dirección del hijo como la dirección de retorno en el padre original. Dado que esta es una operación muy dependiente de la máquina,mcount
sí es una rutina corta de código auxiliar en lenguaje ensamblador que extrae la información requerida y luego llama a__mcount_internal
(una función normal de C) con dos argumentos:frompc
yselfpc
.__mcount_internal
es responsable de mantener el gráfico de llamadas en la memoria, que registra desdefrompc
,selfpc
y el número de veces que se recorrió cada uno de estos arcos de llamadas....
Tenga en cuenta que con tal perfilador de instrumentación, está perfilando el mismo código que compilaría en la versión sin instrumentación de perfilado. Hay una sobrecarga asociada con el código de instrumentación en sí. Además, el código de instrumentación puede alterar la instrucción y el uso del caché de datos.
Al contrario de un perfilador de instrumentación, un perfilador de muestreo como Intel VTune funciona con código no instrumentado al mirar el contador del programa objetivo a intervalos regulares utilizando interrupciones del sistema operativo. También puede consultar registros de CPU especiales para ofrecerle una mejor visión de lo que está sucediendo.
Ver también Profilers Instrumenting Vs Sampling.
Estoy tratando de entender cómo funciona el -pg
(o -p
) al compilar el código C con gcc
.
La documentación oficial de gcc solo establece :
-pg
Generar código adicional para escribir información de perfil adecuada para el programa de análisis gprof. Debe usar esta opción al compilar los archivos de origen sobre los que desea obtener datos, y también debe usarla al vincular.
Esto realmente me interesa, ya que estoy haciendo una pequeña investigación sobre perfiladores, tratando de elegir la mejor herramienta para el trabajo.
De esta fuente: https://elinux.org/images/0/0c/Bird-LS-2009-Measuring-function-duration-with-ftrace.pdf :
"La instrumentación viene en dos formas principales: puntos de rastreo declarados explícitamente y puntos de rastreo implícitos. Los puntos de rastreo explícitos consisten en declaraciones definidas por el desarrollador que especifican la ubicación del punto de rastreo, e información adicional sobre qué datos se deben recopilar en un sitio de rastreo particular. Se colocan puntos de rastreo implícitos en el código automáticamente por el compilador, ya sea debido a los indicadores del compilador o por la redefinición del desarrollador de macros de uso común.
Para instrumentar las funciones de forma implícita, cuando el kernel está configurado para admitir el seguimiento de funciones, el sistema de compilación del kernel agrega -pg a las banderas utilizadas con el compilador. Esto hace que el compilador agregue código al prólogo de cada función, que llama a una rutina de ensamblaje especial llamada mcount. Esta opción de compilador está diseñada específicamente para fines de perfilado y rastreo. "
Este enlace proporciona una breve explicación de cómo funciona gprof.
Este enlace da una extensa crítica de la misma. (Verifique mi respuesta a la pregunta archivada.)