ELF 바이너리가 gprof 인스 트루먼 테이션으로 빌드되었는지 감지합니까?


11

주어진 프로그램이 GNU gprof 인스 트루먼 테이션으로 컴파일되었는지, 즉 파일을 생성하는지 확인하기 위해 프로그램 실행 하지 않고 컴파일러와 링커 모두에 '-pg'플래그가 전달 되었는지 확인할 수 gmon.out있습니까?

답변:


10

당신은 기능에 대한 참조를 확인할 수있다 mcount(또는 아마도 _mcount__mcount에 따라 프로파일 링의 구현 ). 이 기능은 프로파일 링이 작동하는 데 필요하며 프로파일 링되지 않은 이진 파일에는 없어야합니다.

다음과 같은 것 :

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

위의 빠른 테스트에서 작동합니다.


2

위의 답변에서 정규 표현식이 항상 작동하는 것은 아니지만 'readelf -s [binary]'의 출력에서 ​​"mcount"를 grepping하는 일반적인 아이디어는 정확합니다.


0

답변에 더 추가 :

  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생성되지 않습니다. stackoverflow 링크.

  3. 플래그를 사용 gmon.out하여 컴파일 / 링크하더라도 gprof를 실행중인 바이너리가 파일을 생성하지 않는다는 것을 알았습니다 -pg. 그 이유는-나는 응용 프로그램을 죽이고 있었고, 깨끗한 출구는 아니 었습니다. gprof프로그램이 정상적으로 종료 될 때만 출력을 생성합니다. stackoverflow 링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.