주어진 프로그램이 GNU gprof 도구를 사용하여 컴파일되었는지 확인하는 것이 가능합니까? 즉, "-pg" 플래그가 컴파일러와 링커에 전달됩니다.아니요gmon.out
실행하여 파일이 생성되는지 확인하시겠습니까 ?
답변1
함수에 대한 참조를 확인할 수 있습니다 mcount
(가능하거나 _mcount
기반 __mcount
으로 함 ).분석의 구현). 이 기능은 분석이 작동하는 데 필요하며 분석되지 않은 바이너리에는 존재해서는 안 됩니다.
그것은 다음과 같습니다:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
위의 내용은 여기서 빠른 테스트에 적용됩니다.
답변2
위 답변의 정규 표현식이 항상 작동하는 것은 아닙니다... 하지만 "readelf -s [binary]" 출력에서 "mcount"를 greping하는 일반적인 아이디어는 정확하다고 생각합니다.
답변3
답변에 더 많은 콘텐츠 추가:
계측기를 확인하려면 mcount/gmon에 대해 grep을 실행하세요.
$ 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
-pg
플래그로 컴파일하고 링크해야 합니다 . 그렇지 않으면gmon.out
빌드되지 않습니다.스택 오버플로 링크.gmon.out
플래그를 사용하여 컴파일/링크해도 바이너리에서 gprof를 실행하면 파일이 생성되지 않는 것으로 나타났습니다-pg
. 그 이유는 - 신청서를 종료하려고 하는데 완전히 종료되지는 않기 때문입니다.gprof
프로그램이 정상적으로 종료되는 경우에만 출력이 생성됩니다.스택 오버플로 링크