Erkennen Sie, ob eine ELF-Binärdatei mit gprof-Instrumentierung erstellt wurde?

11

Ist es möglich zu überprüfen, ob ein bestimmtes Programm mit GNU gprof instrumentation kompiliert wurde, dh mit dem Flag '-pg', das sowohl an den Compiler als auch an den Linker übergeben wurde, ohne es auszuführen, um zu überprüfen, ob es eine gmon.outDatei generieren würde ?

Jakub Narębski
quelle

Antworten:

10

Sie können nach Funktionsreferenzen suchenmcount (oder möglicherweise _mcountoder __mcountgemäß der Implementierung der Profilerstellung ). Diese Funktion ist erforderlich, damit die Profilerstellung funktioniert, und sollte bei nicht profilierten Binärdateien nicht vorhanden sein.

Etwas wie:

$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"

Das Obige funktioniert hier bei einem Schnelltest.

Matte
quelle
2

Der reguläre Ausdruck in der obigen Antwort funktioniert nicht immer ... aber die allgemeine Idee, in der Ausgabe von 'readelf -s [binary]' nach "mcount" zu suchen, ist meiner Meinung nach richtig

Ben
quelle
0

Mehr zu den Antworten hinzufügen:

  1. Um nach Instrumenten zu suchen, grep nach 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. Man muss sowohl kompilieren als auch mit -pgFlags verknüpfen , sonst gmon.outwird nicht generiert. Stackoverflow-Link.

  3. Ich fand heraus, dass die Binärdatei, auf der ich gprof ausführte gmon.out, trotz Kompilieren / Verknüpfen mit -pgflag keine Datei generierte . Der Grund dafür war - ich habe meine Bewerbung beendet, es war kein sauberer Ausgang. gprofErzeugt nur eine Ausgabe, wenn das Programm normal beendet wird. Stackoverflow-Link

gebrochener Fuß
quelle