gcov를 통한 커버리지 정보 알아보기
: gcov는 gcc에 포함된 유틸리티로 코드 커버리지를 파악하는 데 쓰인다. 이는 어떤 부분이 얼마만큼 수행되는지, 어느 부분이 한 번도 수행되지 않는지를 파악할 수 있고, 이런 정보를 이용해 불필요한 코드 제거에 사용되어질 수 도 있다. 앞서 설명한 gprof와 비교하자면, gprof는 함수 단위의 프로파일링 정보만을 제공하는 반면에 gcov는 베이직 블록 단위의 프로파일링을 수행해 함수 내 어떤 루프가 많이 수행되었는지, if-else 블록에서 어느 블록이 많이 수행되었는지를 알 수 있다.
// main.c
#include <stdio.h>
void func1()
{
printf("Hello World \n");
}
void func2(int delay)
{
printf("Delay: %d", delay);
while (delay--);
}
int main()
{
for (int i = 0; i < 10; ++i) {
func1();
}
for (int i = 0; i < 100; ++i) {
func2(i);
}
return 0;
}
위와 같은 파일이 있다고 할 때, gcov를 이용한 라인 커버리지를 확인하는 방법은 다음과 같다.
gcc -o main main.c -fprofile-arcs -ftest-coverage -g
명령으로 컴파일을 수행한다.-fprofile-arcs -ftest-coverage
옵션은 소스의 각 베이직 블록에 프로파일링 코드를 삽입하라는 옵션이다.
./main
을 통해 프로그램을 한 번 수행시킨다.- 이는
main.gcda
,main.gcno
파일을 생성시킨다. 이 두 파일에 소스파일의 베이직 블록에 대한 프로파일링 정보가 포함된다.
- 이는
gcov main.c
명령을 수행하여main.c.gcov
파일을 생성시킨다.cat main.c.gocv
명령을 통해 프로파일링 정보를 확인한다.
1: 1: #include <stdio.h>
-: 2:
-: 3: void func1()
10: 4: {
10: 5: printf("Hello World \n");
10: 6: }
-: 7:
-: 8: void func2(int delay)
100: 8: {
...
- 각 라인의 맨 앞에 있는 숫자는 해당 라인이 몇 번 호출되었는지를 나타낸다.
'빌드&테스트도구 > 테스팅도구(gcov,gtest.' 카테고리의 다른 글
gtest - google에서 개발한 TC framework (0) | 2020.10.09 |
---|---|
valgrind - 메모리 관련 문제 파악 (0) | 2020.10.03 |
lcov, genhtml - coverage 정보를 깔끔한 웹 페이지로 만들기 (0) | 2020.09.28 |