È possibile verificare se un determinato programma è stato compilato con la strumentazione GNU gprof, cioè con il flag '-pg' passato sia al compilatore che al linker, senza eseguirlo per verificare se genererebbe un gmon.out
file?
È possibile verificare se un determinato programma è stato compilato con la strumentazione GNU gprof, cioè con il flag '-pg' passato sia al compilatore che al linker, senza eseguirlo per verificare se genererebbe un gmon.out
file?
Risposte:
È possibile verificare la presenza di riferimenti alla funzione mcount
(o eventualmente _mcount
o in __mcount
base all'implementazione della profilazione ). Questa funzione è necessaria affinché la profilazione funzioni e dovrebbe essere assente per i binari non profilati.
Qualcosa di simile a:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
Quanto sopra funziona su un test rapido qui.
Aggiungendo altro alle risposte:
Per verificare la strumentazione, grep per 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
È necessario compilare e collegare con -pg
flag, altrimenti gmon.out
non verrà generato. collegamento stackoverflow.
Ho scoperto che il binario su cui stavo eseguendo gprof non ha generato alcun gmon.out
file, nonostante la compilazione / collegamento con -pg
flag. Il motivo è che stavo uccidendo la mia domanda, non era un'uscita pulita. gprof
genera output solo quando il programma esce normalmente. collegamento stackoverflow