¿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.out
archivo?
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.out
archivo?
Puede verificar las referencias a la función mcount
(o posiblemente _mcount
o de __mcount
acuerdo 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 -pg
banderas, de lo contrario gmon.out
no se generará. enlace stackoverflow.
Descubrí que el binario en el que ejecutaba gprof no generaba ningún gmon.out
archivo, a pesar de compilar / vincular con -pg
flag. La razón es que estaba matando mi aplicación, no era una salida limpia. gprof
genera salida solo cuando el programa sale normalmente. enlace stackoverflow