GPROF(1)

명칭
gprof - 호출 그래프에 근거하는 프로파일 데이터를 표시한다

서식
gprof [options] [a.out [a.out.gmon ...]]

해설
gprof 유틸리티는, C 나 Pascal, Fortran77 의 실행 프로파일을 생성합니다. gprof 그럼, 불려 간 routine의 실행 시간은, 호출한 측의 routine에 가산됩니다. 프로파일 데이터는, 호출 그래프 프로파일 파일 (call graph profile file) (으)로부터 읽어내집니다. 이 파일은, cc(1), pc(1), f77(1) 에 -pg (을)를 붙여 컴파일 된 프로그램에 의해 생성됩니다. -pg (을)를 붙이면(자), 컴파일러는 프로파일용 프로그램 라이브러리를 링크 합니다. 약속한 일의 형태로서 이러한 프로그램 라이브러리의 이름의 뒤에는 _p 하지만 붙습니다. 즉, 프로파일 되는 버젼의 libc.a 하 libc_p.a (이어)여, 컴파일러나 인가에 직접 프로그램 라이브러리를 지정할 경우에 -lc 대신에 -lc_p (을)를 사용 가능합니다. 주어진 오브젝트 파일 (디폴트에서는 a.out) (을)를 읽어들여, 그 오브젝트의 심볼 테이블과 호출 그래프 프로파일을 연결시킵니다. 디폴트의 그래프 프로파일 파일의 이름은, 실행 형식명에 사픽스 .gmon (을)를 붙인 것입니다. 2 개(살) 이상의 프로파일 파일이 주어지면(자), gprof (은)는, 그러한 정보를 합계해 출력합니다.

gprof 유틸리티는, 각 routine가 소비한 시간을 계산합니다. 다음에, 이 시간은 호출해 그래프의 옆에 따라 전파 됩니다. 사이클이 발견되면(자), 사이클에 대한 호출이, 사이클의 시간을 공유하는 것으로 여겨집니다. 최초의 리스트에는, 함수로부터의 호출 그래프 전체의 합계 시간에 의해 정렬 된 함수가 표시되고 있습니다. 각 함수의 엔트리아래에는, 그 함수의 호출 그래프 에서의 (직접적인) 아이 (즉 불려 간 함수명)가 표시되어 그러한 함수의 소비 시간이 어느 정도 부모 (즉 호출한 측의 함수)에게 전파 되고 있을지가 나타나고 있습니다. 같이 각 함수의 엔트리의 위쪽에는, 함수에서의 소비 시간이 호출해 원의 함수에 어떻게 전파 되고 있을지가 나타나고 있습니다.

사이클 전체와 그 멤버의 리스트를 나타낸 엔트리가, 사이클의 호출 회수나 실행 시간에의 각 멤버의 기여를 포함해 표시됩니다.

다음의 리스트에서는, prof(1) (NetBSD, FreeBSD에는 없습니다)(와)과 같은 플랫 프로파일 (flat profile) 표시됩니다. 여기에는, 함수의 합계 실행 시간이나 호출해 회수, 그 함수 본체만의 실행 시간 (밀리 세컨드 또는 마이크로 세컨드), 그 함수 본체 및 거기로부터 불려 간 함수의 실행 시간 (밀리 세컨드 또는 마이크로 세컨드), 하지만 표시됩니다.

마지막에 함수명의 색인이 표시됩니다.

이하의 옵션이 이용 가능합니다.

-a  정적으로 선언된 함수의 표시를 억제합니다. 이 옵션이 지정되면(자), 정적 함수에 대한 모든 관련하는 정보 (실행 시간, 다른 함수의 호출해, 다른 함수로부터의 호출등)(이)가, a.out 파일중의 정적 함수의 직전에 읽어 입되는 함수에 포함되게 됩니다.

-b  프로파일중의 각 필드의 설명문을 억제합니다.

-c  오브젝트 파일의 텍스트 공간을 조사하는 발견적인 방법을 사용해, 프로그램의 정적 호출 그래프를 찾아냅니다. 정적인 호출만의 부모와 아이는, 호출수 0 으로서 표시됩니다. 아키텍쳐에 따라서는, 본옵션은 서포트되고 있지 않습니다.

-C count
    count 수이상의 함수를 포함한 (호출 관계의) 사이클을 없애기 위해서(때문에), 절단 해야 할 아크 (호출 관계)의 최소 집합을 찾아냅니다. 주의:사이클을 중단하기 위해서 이용되는 알고리즘은 지수함수적인 물건입니다. 그 때문에, 이 옵션을 지정하면(자), gprof (을)를 실행하는데 매우 긴 시간이 걸립니다.

-e name
    routine name (와)과 그 모든 자손 (그러한 함수가 표시 억제되어 있지 않은 부모를 그 밖에 가지고 있지 않으면)의 그래프 프로파일 엔트리의 표시를 억제 합니다. 2 개(살) 이상의 -e (을)를 지정할 수가 있습니다. 각 -e 에는 1 개(살) 밖에 name (을)를 지정할 수가 없습니다.

-E name
    -e (와)과 같이, 지정된 routine name 의 그래프 프로파일 엔트리 표시를 억제합니다. 게다가 프로그램의 토탈의 시간과 계산 시간의 퍼센티지로부터 name 그리고 사용되고 있는 시간이 걸려 제외합니다. (예를 들어, -E mcount -E mcleanup 하지만 디폴트입니다)

-f name
    지정된 routine name (와)과 그 자손의 그래프 프로파일 엔트리 만을 표시합니다. -f 옵션은, 복수 지정할 수가 있습니다. 각 옵션 -f 에는, 1 개(살) 밖에 name (을)를 지정할 수가 없습니다.

-F name
    -f (와)과 같게, 지정된 routine name (와)과 그 자손의 그래프 프로파일 엔트리만을 표시합니다. 프로그램의 토탈의 시간과 계산 시간의 비율 에는, 표시된 routine의 시간만이 사용됩니다. -F (은)는 복수 지정할 수가 있습니다. 각 옵션 -F 에는, 1 개(살) 밖에 name (을)를 지정할 수가 없습니다. 옵션 -F (은)는, 옵션 -E 의 효과를 지웁니다.

-k fromname toname
    fromname (으)로부터 toname 에의 함수 호출 관계의 아크를 삭제합니다. 이 옵션에 의해, 불필요하다고 생각하는 사이클을 절단 할 수가 있습니다. 옵션 -k (은)는, 복수 지정할 수가 있습니다. 각 옵션 -k 에는 한 벌의 routine명 (fromname (와)과 toname) 밖에 지정할 수가 없습니다.

-l  호출 그래프 프로파일의 표시를 억제합니다.

-L  플랫 프로파일의 표시를 억제합니다.

-s  지정된 모든 프로파일 파일중의 프로파일 정보의 합계 (을)를 나타내는 요약 프로파일 파일 gmon.sum 하지만 생성됩니다. 이 요약 프로파일 파일은 이후에의 gprof 의 실행에 대해 주어지고 (그때에도 통상 -s 하지만 지정된다), 일련의 a.out 실행의 결과의 프로파일 데이터의 합계를 요구할 수가 있습니다.

-u  C 프로그램에는 안보이는 이름의 함수의 표시를 억제합니다. ELF 오브젝트 형식에서는, 캐릭터 ‘.’ (을)를 포함한 이름을 의미합니다. a.out 오브젝트 형식에서는, 캐릭터 ‘_’ 그리고 개시하지 않는 이름을 의미합니다. 그러한 함수에 관련하는 정보는, 바로 저위측의 주소에 있다 (표시가 억제되어 있지 않다) 함수에 포함됩니다. 이것에 의해 함수내에 있는 단순한 label가 함수로 인식되어 버리는 것을 막을 수가 있습니다.

-z  사용되어 있지 않은 routine (호출 회수와 합계 시간이 0 이다)를 표시합니다. -c 옵션과 함께 사용하면(자), 한번도 불리지 않은 routine를 발견할 수가 있습니다.

관련 파일
a.out
    텍스트 공간과 이름 리스트
a.out.gmon
    동적인 호출 그래프와 프로파일
gmon.sum
    동적인 호출 그래프와 프로파일의 요약

관련 항목
cc(1), profil(2), clocks(7)

An Execution Profiler for Modular Programs, S. Graham, P. Kessler, M. McKusick, Software - Practice and Experience, 13, pp. 671-685, 1983.

gprof: A Call Graph Execution Profiler, S. Graham, P. Kessler, M. McKusick, Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices, 17, 6, pp. 120-126, June 1982.

역사
gprof 프로 filer는, 4.2BSD (으)로부터 등장했습니다.

버그
샘플링의 주기가 리스트의 최초로 표시됩니다만, 통계적인 역을 나오지 않는 것으로 있을지도 모릅니다. 우리는, 각 함수의 실행 시간은 그 함수가 소비한 시간의 합계를 그 함수의 호출 회수로 나눈 것에 의해 표현되면(자) 가정하고 있습니다. 따라서, 호출 그래프의 관계에 따라 함수의 부모에게 전파 되는 시간은, 그 관계를 더듬는 회수에 직접 비례하고 있습니다.

자신이 프로파일되어 있지 않은 부모는, 프로파일 하고 있는 아이로부터 전파 되는 시간을 가지고 있어 호출 그래프의 리스트 속에서 자동적으로 기동되는 것으로서 나타납니다. 그러나, 이 함수가 가지는 시간은 그 이상 전파 되지 않습니다. 같이 시그널을 포착하는 함수는, 그것들이 프로파일 되고 있어도, 자동적으로 기동되는 것으로서 나타납니다 (좀 더 복잡한 이유가 있습니다만). 프로파일 routine를 실행하고 있는 한중간에 시그널을 포착한다 함수가 호출 되었을 때 (이 경우는 모든 것이 없어져 버립니다)를 제외해서는, 시그널을 포착하는 함수의 아이의 실행 시간은, 그 부모에게 올바르고 전파 되어야 합니다.

프로파일 되고 있는 프로그램은, 그래프 프로파일 파일에 프로파일 정보가 세이브되는 듯 exit(3) (을)를 부르는지, 정상적으로 종료하지 않으면 안됩니다.