gprof 도구를 사용하여 ELF 바이너리가 빌드되었는지 감지합니까?

gprof 도구를 사용하여 ELF 바이너리가 빌드되었는지 감지합니까?

주어진 프로그램이 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

답변에 더 많은 콘텐츠 추가:

  1. 계측기를 확인하려면 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    
    
  2. -pg플래그로 컴파일하고 링크해야 합니다 . 그렇지 않으면 gmon.out빌드되지 않습니다.스택 오버플로 링크.

  3. gmon.out플래그를 사용하여 컴파일/링크해도 바이너리에서 gprof를 실행하면 파일이 생성되지 않는 것으로 나타났습니다 -pg. 그 이유는 - 신청서를 종료하려고 하는데 완전히 종료되지는 않기 때문입니다. gprof프로그램이 정상적으로 종료되는 경우에만 출력이 생성됩니다.스택 오버플로 링크

관련 정보