Gcov
gcov는 커버리지 테스트 프로그램이다. gcov를 GNU CC와 함께 사용하면 보다 빠르고 효율적인 프로그램 코드를 만들기 위한 분석을 시행해 볼 수 있다. gcov는 프로그램 코드의 어느 부분을 최적화 시키는 것이 가장 좋은 선택인지를 판단하기 위한 프로파일링 도구(profiling tool)로 사용될 수 있으며, gprof 등과 함께 사용하면 프로그램 코드의 어느 부분이 데이터 입출력 처리를 제외한 사칙 연산 등의 실제 연산 처리 소요 시간을 가장 많이 차지하고 있는 지 알아낼 수 있다.
프로파일링 도구들은 프로그램 코드의 성능을 분석하는데 도움이 되며, gprof와 같은 프로파일러를 사용하면 다음과 같은 기본적인 통계 정보를 얻을 수 있다.
- 코드를 구성하는 각 행의 실행 횟수
- 코드 중 어떤 행이 실제로 실행되는 지에 대한 정보
- 코드의 특정 부분이 소모한 계산 시간
위와 같은 사항들을 통해서 작성된 코드가 컴파일 과정에서 어떻게 동작하는 지를 확인한 후에, 어떤 부분을 최적화시켜야 할 지 판단할 수 있다. gcov는 어느 부분을 최적화 시켜야 하는 지를 판단하는데 도움을 준다.
소프트웨어 개발자들은 개발된 소프트웨어가 배포 가능한 정도의 성능을 보이는 지를 확인하기 위해서 단위 검사(unit test) 등의 테스트를 커버리지 분석과 함께 사용한다. 이때 사용되는 테스트들은 프로그램이 예상대로 작동하는 지를 검증할 수 있는데, 커버리지 프로그램은 테스트에 의해서 프로그램이 어떻게 작동하는 지를 확인하기 위해서 사용되며 그 결과에 따라서 개발자들은 테스트 기능을 보다 좋게 개량하고, 만들어질 제품을 향상시키기 위해서 어떠한 검사 항목이나 기능이 추가되어야 할 지를 결정할 수 있다.
gcov를 사용하고자 한다면 컴파일 시에 GNU CC 최적화 옵션을 사용하지 않아야 한다. 왜냐하면, 코드를 최적화 해서 컴파일 할 경우에는 여러 개의 행들이 하나의 함수로 통합될 수 있기 때문에 프로그램 실행 시에 계산 시간이 많이 소요되는 부분을 찾기 위한 정보를 많이 얻을 수 없기 때문이다. 또한 gcov는 행을 최소 처리 단위로 통계를 산출하기 때문에 한 행에 하나의 문장을 입력하는 프로그래밍 스타일을 사용할 때 최상의 결과를 가져올 수 있다. 만약, 루프나 제어 구문으로 확장된 복잡한 형태의 매크로를 사용한 경우에는 매크로가 호출된 행만을 출력해 주는 gcov의 통계는 큰 도움이 되지 않는다. 복잡한 형태의 매크로가 마치 함수와 같이 사용될 경우에는 이러한 문제를 해결하기 위해서 매크로가 아닌 인라인 함수(inline function)의 형태로 수정할 수 있다.
gcov는 소스 파일인 sourcefile.c'를 구성하는 각각의 행들이 몇 번씩 실행되었는 지를 알려주는 로그 파일인
sourcefile.gcov'를 생성하는데, 이러한 로그 파일은 gprof와 함께 프로그램을 보다 나은 성능으로 튜닝하는데 사용될 수 있다. gprof는 gcov로부터 얻은 정보에 덧붙여서 시간에 대한 정보도 함께 제공해 줄 수 있다.
gcov는 GNU CC로 컴파일된 코드에서만 동작하며, 다른 종류의 프로파일링이나 테스트 커버리지 방식과는 호환되지 않는다.
How to use
GCC에 아래 옵션을 추가하면 된다.
-
CFLAGS
:-fprofile-arcs
-ftest-coverage
-
LFLAGS
:-lgcov
--coverage
Trubleshooting
undefined reference __gcov_init
__gcov_init
같은 심볼을 찾을 수 없을 경우 링커 옵션에 -lgcov
가 추가되었는지 확인하면 된다.