Czy można sprawdzić, czy dany program został skompilowany z instrumentacją GNU gprof, tj. Z flagą „-pg” przekazaną zarówno do kompilatora, jak i linkera, bez uruchamiania go, aby sprawdzić, czy wygeneruje gmon.out
plik?
Czy można sprawdzić, czy dany program został skompilowany z instrumentacją GNU gprof, tj. Z flagą „-pg” przekazaną zarówno do kompilatora, jak i linkera, bez uruchamiania go, aby sprawdzić, czy wygeneruje gmon.out
plik?
Odpowiedzi:
Można sprawdzić odniesienia do funkcji mcount
(lub ewentualnie _mcount
czy __mcount
według Wdrażania Profilowanie ). Ta funkcja jest niezbędna do profilowania, aby działała i powinna być nieobecna w przypadku nieprofilowanych plików binarnych.
Coś jak:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
Powyżej działa tutaj szybki test.
Dodając więcej do odpowiedzi:
Aby sprawdzić instrumentację, grep dla 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
Należy skompilować, a także połączyć z -pg
flagami, w przeciwnym razie gmon.out
nie zostaną wygenerowane. link do nakładania stosu.
Odkryłem, że plik binarny, na którym działałem, gprof nie wygenerował żadnego gmon.out
pliku, pomimo kompilacji / dowiązania z -pg
flagą. Powodem było to, że - zabijałem moją aplikację, nie było to czyste wyjście. gprof
generuje wyjście tylko wtedy, gdy program kończy się normalnie. link do nakładania stosu