¿Es posible verificar si el programa dado fue compilado con la instrumentación GNU gprof, es decir, con el indicador '-pg' pasado tanto al compilador como al enlazador, sin ejecutarlo para verificar si generaría un gmon.outarchivo?
fuente
¿Es posible verificar si el programa dado fue compilado con la instrumentación GNU gprof, es decir, con el indicador '-pg' pasado tanto al compilador como al enlazador, sin ejecutarlo para verificar si generaría un gmon.outarchivo?
Puede verificar las referencias a la función mcount(o posiblemente _mcounto de __mcountacuerdo con la Implementación de perfiles ). Esta función es necesaria para que los perfiles funcionen, y debe estar ausente para los binarios sin perfil.
Algo como:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
Lo anterior funciona en una prueba rápida aquí.
La expresión regular en la respuesta anterior no siempre funciona ... pero la idea general de grepping para "mcount" en la salida de 'readelf -s [binary]' es correcta, creo
Agregando más a las respuestas:
Para verificar la instrumentación, grep para mcount / gmon:
$ readelf -s <binary> | egrep "gmon|mcount"
20: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
28: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@GLIBC_2.2.5 (2)
36: 0000000000000000 0 FILE LOCAL DEFAULT ABS gmon-start.c
39: 00000000004011a0 0 FUNC LOCAL DEFAULT 12 call_gmon_start
100: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
114: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@@GLIBC_2.2.5
Es necesario compilar y vincular con -pgbanderas, de lo contrario gmon.outno se generará. enlace stackoverflow.
Descubrí que el binario en el que ejecutaba gprof no generaba ningún gmon.outarchivo, a pesar de compilar / vincular con -pgflag. La razón es que estaba matando mi aplicación, no era una salida limpia. gprofgenera salida solo cuando el programa sale normalmente. enlace stackoverflow