Rileva se un binario ELF è stato creato con la strumentazione gprof?


11

È 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.outfile?

Risposte:


10

È possibile verificare la presenza di riferimenti alla funzione mcount(o eventualmente _mcounto in __mcountbase 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.


2

L'espressione regolare nella risposta sopra non funziona sempre ... ma l'idea generale di cercare "mcount" nell'output di "readelf -s [binary]" è corretta, penso


0

Aggiungendo altro alle risposte:

  1. 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    
    
  2. È necessario compilare e collegare con -pgflag, altrimenti gmon.outnon verrà generato. collegamento stackoverflow.

  3. Ho scoperto che il binario su cui stavo eseguendo gprof non ha generato alcun gmon.outfile, nonostante la compilazione / collegamento con -pgflag. Il motivo è che stavo uccidendo la mia domanda, non era un'uscita pulita. gprofgenera output solo quando il programma esce normalmente. collegamento stackoverflow

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.