| HOME / 정보공유 / AIX 명령어 모음

gprof
gprof gprof 명령 목적 호출 그래프 프로파일 데이터를 나타냅니다. 구문
/usr/ucb/gprof [ -b ] [ -e Name ] [ -E Name ] [ -f Name ] [ -F Name ] [ -L PathName ] [ -s ] [ -z ] [ a.out [ gmon.out ... ] ]
설명
gprof 명령은 C, Pascal, FORTRAN 또는 COBOL 프로그램의 실행 프로파일을 작성합니다. 피호출 루틴의 결과는 각 호출자의 프로파일에 통합됩니다. gprof 명령은 프로그램이 CPU 자원을 소비하는 방법을 식별하는 데 유용합니다. 프로그램의에서 CPU를 사용하고 있는 기능(루틴)을 찾기 위해, gprof 명령으로 프로그램을 프로파일할 수 있습니다.
프로파일 데이터는 -pg 옵션을 사용하여 명령으로 컴파일된 프로그램이 작성한 호출 그래프 프로파일 파일(디폴트로, gmon.out)로부터 받습니다. -pg 옵션은 프로파일할 컴파일된 라이브러리 루틴 버전으로 연결하고, 이름붙여진 오브젝트 파일(디폴트로, a.out)에 있는 기호 테이블을 읽어, 이를 호출 그래프 프로파일 파일에 연관시킵니다. 하나 이상의 프로파일 파일을 지정하면, gprof 명령 출력에는 주어진 프로파일 파일 내의 프로파일 정보의 합계가 표시됩니다.
-pg 옵션을 사용하면 컴파일러는 mcount 서브루틴에 대한 호출을 프로그램의 재컴파일된 기능에 대해 작성된 오브젝트 코드로 삽입합니다. 프로그램 실행중에, 상위 기능이 하위 기능을 호출할 때마다 하위 기능은 mcount 서브루틴을 호출하여 그 상위-하위 쌍에 대한 별개의 계수기를 증가시킵니다. -pg 옵션을 사용하여 재컴파일되지 않은 프로그램에는 삽입된 mcount 서브루틴이 없기 때문에, 호출한 레코드를 보관할 수 없습니다.
주: C++ 오브젝트 파일의 기호에는 사용하기 전에 demangled 이름이 있습니다.
gprof 명령은 세 가지 항목을 만들어냅니다.
먼저, 일반 프로파일은 prof 명령에 의해 제공된 것과 유사하게 작성됩니다. 이 리스트는 프로그램 내의 각 기능에 대한 총 실행 시간 및 호출 계수를 제공하며, 시간이 적은 순서로 분류됩니다. 그런 다음, 시간은 호출 그래프의 경계를 따라 전달됩니다. 순환이 발견되고, 순환 시간을 공유하기 위해 순환으로의 호출이 이루어집니다.
두 번째 나열은 하행성 호출-그래프 시간을 포함하여, 표시한 시간에 따라 분류하는 기능을 나타냅니다. 아래의 각 기능 입력항목은 (직접) 호출-그래프 하위이고, 시간이 이 기능으로 전달되는 방법을 나타냅니다. 위의 기능과 유사한 표시화면은 기능 시간과 하행선 시간을 (직접) 호출-그래프 상위로 전달하는 방법을 나타냅니다.
전체 주기의 입력항목, 주기 멤버의 나열 및 주기의 호출 계수와 시간에 대한 기여와 함께, 주기를 나타냅니다.
분기 실행(fork)과 exec 서브루틴에 대한 프로파일링
gprof 명령을 사용하는 프로파일링은 사용자의 프로그램이 분기 실행(fork) 또는 exec 서브루틴을 동시, 다중 프로세스에서 수행할 경우에 문제를 일으킬 수 있습니다. 프로파일링은 각 프로세스의 환경 속성이기 때문에, 새로운 프로세스를 분기 실행하는 프로세스를 프로파일링하면 서브프로세스도 프로파일됩니다. 단, 두 프로세스 모두 상위 프로세스를 수행한 디렉토리에 gmon.out 파일을 기록하므로 둘 중 하나는 겹쳐쓰게 됩니다. tprof 명령은 복수 프로세스 프로파일링에 적합합니다.
gprof 명령을 사용해야 할 경우, 이 문제를 우회하는 한 가지 방법은 chdir 서브루틴을 호출하여 서브프로세스의 현재 디렉토리를 변경하는 것입니다. 그런 다음, 서브프로세스가 종료되면 gmon.out 파일은 새로운 디렉토리에 기록됩니다. 다음 예제에 이 방법이 설명되어 있습니다.
cd /u/test # current directory containing forker.c program
pg forker.c
main()
{
int i, pid;
static char path[]="/u/test2";
pid=fork(); /* fork a child process */
if(pid==0) { /* Ok, this is the child process */
chdir (path); /* create new home directory so
gmon.out isn't clobbered! */
for (i=0; i<30000; i++) sub2(); /* 30000 calls to sub2
}
else /* Parent process... leave gmon.out
for (i=0;i<1000; i++) sub1(pid); /* 1000 calls to sub1
}
int sub1(pid) /* silly little function #1, called
int pid;
{
int i;
printf("I'm the parent, child pid is %i.\n",pid);
}
int sub2() /* silly little function #2, called
{
printf("I'm the child.\n");
}
cc -pg forker.c -o forker # compile the program
mkdir /u/test2 # create a directory for childi
to write gmon.out in
forker >/dev/null # Throw away forker's many,
useless output lines
gprof forker >parent.out # Parent process's gmon.out is
in current directory
gprof forker ../test2/gmon.out >child.out
# Child's gmon.out is in test2
이 시점에서, test, parent.out, 및 child.out 디렉토리에 있는 gprof 명령의 출력 리스트 두 개를 비교하면, sub1 서브루틴을 상위에서는 1,000번, 하위에서는 0 번 호출하였고 반면에 sub2 서브루틴은 하위에서 30,000번, 상위에서 0 번 호출한 것을 볼 수 있습니다.
exec 서브루틴을 수행하는 프로세스는 프로파일링을 상속하지 않습니다. 단, exec 서브루틴에 의해 실행되는 프로그램이 -pg 옵션을 사용하여 컴파일된 경우에는 프로파일되어야 합니다. 앞에 나온 forker.c 예제에서 처럼, 상위와 프로그램을 모두 exec 서브루틴으로 수행하면, 프로그램은 프로파일되고, 둘 중 하나에 chdir 서브루틴을 사용하지 않으면, 하나가 다른 하나의 gmon.out 파일을 겹쳐 쓰게 됩니다.
소스 코드 없이 프로파일링
프로그램의 소스가 없을 경우, gprof 명령을 사용하여 재컴파일하지 않고 프로파일할 수 있습니다. 단, 해당 컴파일러 옵션(예: C인 경우에는 cc)을 사용하여 프로그램 모듈을 다시 링크할 수 있어야 합니다. 재컴파일을 하지 않으면, 일반 프로파일이 아직 이들 없이 유용하다 하더라도 호출 빈도 계수를 확보할 수 없습니다. 추가된 장점으로서, 프로그램은 일반적으로 수행하던 것과 동일한 속도로 수행합니다. 다음은 프로파일 방법에 대해 설명합니다.
cc -c dhry.c # Create dhry.o without call counting code.
cc -pg dhry.o -L/lib -L/usr/lib -o dhryfast
# Re-link(and avoid -pg libraries).
dhryfast # Create gmon.out without call counts.
gprof >dhryfast.out # You get an error message about no call counts
# -- ignore it.
호출 계수 없이 수행한 결과로 일부 고속 실행 기능(당연히 호출되었어야 할)이 리스트에 전혀 나타나지 않습니다. 비직관적이기는 하지만, 이 결과는 gprof 명령에 대해서는 일반적입니다. gprof 명령은 한 번 이상 호출되었거나 하나 이상의 시간 표시(tick)가 등록된 기능만을 나열합니다. 기능이 수행되었더라도, 신속하게 수행되는 기능은 시간 표시(tick)를 수신하지 못할 수 있습니다. 호출-계산이 일시중단되어 이러한 작은 기능은 전혀 나열되지 않습니다(cc -pg 명령행에서 -L 옵션을 생략함으로써 수행시간 루틴에 대한 호출 계수를 확보할 수 있습니다).
실제 메모리를 적게 사용
-pg 옵션이 프로그램 텍스트 크기의 1/2과 동일한 양의 고정된 실제 메모리 버퍼 공간을 전용으로 사용하기 때문에 gprof 명령을 사용한 프로파일링은 프로그램이 과도하게 페이징되는 원인이 됩니다. 프로파일된 프로그램이 I/O를 기다릴 때 눈금 표시를 작성하지 않기 때문에, CPU를 사용할 경우에만 과다한 페이징이 프로파일에 의해 작성된 데이터에 영향을 미치지 않습니다. 과도한 페이징이 승인되지 않아 시간 지연이 발생한 경우, tprof 명령을 사용하도록 권장합니다.
플래그
-b 프로파일에 있는 각 필드에 대한 설명 인쇄를 억제합니다.
-E Name Name 루틴과 그 하위에 대한 그래프 프로파일 항목의 인쇄를 억제합니다. 이는 -e 플래그와 비슷하지만 합계 및 퍼센트 시간 계산에서 Name 루틴과 그 하위가 소비한 시간을 제외합니다(-E MonitorCount -E MonitorCleanup이 디폴트입니다).
-e Name 루틴 Name과 모든 하위에 대한 그래프 프로파일 입력항목의 인쇄를 억제합니다(억제되지 않은 다른 조상이 없는 경우). 하나 이상의 -e 플래그를 지정할 수 있습니다. -e 플래그에는 하나의 루틴만 지정할 수 있습니다.
-F Name -f 플래그와 유사한 루틴 Name과 그 하위에 대한 그래프 프로파일 입력항목을 인쇄하지만, 인쇄된 루틴 시간을 전체 시간 및 백분율 계산 시에만 사용합니다. 하나 이상의 -F 플래그를 지정할 수 있습니다. 각 -F 플래그에는 하나의 루틴만을 지정할 수 있습니다. -F 플래그는 -E 플래그를 겹쳐씁니다.
-f Name 지정된 루틴 Name과 그 하위의 그래프 프로파일 입력항목을 인쇄합니다. 하나 이상의 -f 플래그를 지정할 수 있습니다. 각 -f 플래그에는 하나의 루틴만을 지정할 수 있습니다.
-L PathName 공유 오브젝트가 위치할 대체 경로 이름을 사용합니다.
-s gmon.sum 프로파일 파일을 작성하며, 이는 지정된 모든 프로파일 파일에 있는 프로파일 정보의 요약을 나타냅니다. 이 요약 프로파일 파일을 gprof 명령의 후속 실행에 제공하여 (-s 플래그 사용) 여러 a.out 파일 실행을 통한 프로파일 데이터를 누적할 수 있습니다.
-z 0 사용법(호출 계수와 누적 시간으로 표시됨)이 있는 루틴을 나타냅니다.
예제
프로파일 출력을 얻으려면, 다음과 같이 입력하십시오.
gprof
명령 실행에서 프로파일링 출력을 빨리 얻으려면, 다음과 같이 입력하십시오.
gprof -L/home/score/lib runfile runfile.gmon
이 예제는 표본 데이터에 대해 제공된 runfile.gmon 파일을 사용하고, 국지 기호에 대해 runfile 파일을 사용합니다. 그리고 로드할 수 있는 오브젝트에 대해 /u/score/lib 파일을 검사합니다.
표본 프로그램 dhry.c를 프로파일하려면, 다음과 같이 입력하십시오.
다음과 같이, 응용프로그램을 cc -pg 명령으로 다시 컴파일하십시오.
cc -pg dhry.c -o dhry # Re-compile to produce gprof output.
재컴파일된 프로그램을 수행하십시오. 파일 gmon.out을 현재 작업 디렉토리(실행 가능한 프로그램이 있는 디랙토리가 아님)에 작성합니다.
dhry # Execute program to generate ./gmon.out file.
디렉토리에 있는 gprof 명령을 gmon.out과 함께 수행하여 CALL-GRAPH와 FLAT PROFILE 보고서를 작성하십시오.
gprof >gprof.out # Name the report whatever you like
vi gprof.out # Read flat profile first.
gprof 명령을 설명하는 동안, 대부분의 예제는 C 프로그램 dhry.c를 사용합니다. 그러나 설명 및 예제는 cc인 C 컴파일러를 해당 컴파일러 이름으로 그리고 서브루틴을 기능 단어로 교체하면 FORTRAN, Pascal 또는 COBOL 모듈에도 똑같이 적용됩니다. 예를 들어, 다음 명령은 matrix.f라는 FORTRAN 프로그램의 프로파일 방법을 표시합니다.
xlf -pg matrix.f -o matrix # FORTRAN compile of matrix.f program
matrix # Execute with gprof profiling,
# generating gmon.out file
gprof > matrix.out # Generate profile reports in
# matrix.out from gmon.out
vi matrix.out # Read flat profile first.
파일
a.out 이름 리스트와 텍스트 공간
gmon.out 동적 호출 그래프와 프로파일
gmon.sum 요약한 동적 호출 그래프와 프로파일
/usr/ucb/gprof gprof 명령이 들어 있습니다.
관련 정보
cc 명령, prof 명령.
exit 서브루틴, monitor 서브루틴, profil 서브루틴.