sample code

// Sample code
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){

    srand(time(NULL));

    int count = 0;

    for(;;){
        int random_number = rand() % 100;

        if(random_number > 95)
            break;
        else if(random_number > 100)
            continue;
        else
            count++;
    }

    printf("count : %d\n", count);

}

build & execute

gcc --coverage -o coverage coverage.c
./coverage
  • --coverage 옵션으로 컴파일 하고, 실행하면 같은 경로에 .gcda, .gcno 파일이 생성된다.
  • gcda: 커버리지 정보 및 실행 횟수가 포함(동일경로에 생성되지만 -fprofile-dir 옵션으로 경로 설정 가능)
  • gcno: 기본 블록 그래프를 재구성하고 블록에 소스 라인 번호를 할당하는 정보가 포함.(동일경로에 생성)

analysis

gcov

gcov coverage.c 
// 같은 경로에 coverage.c.gcov 파일 생성

cat coverage.c.gcov
/*
        -:    0:Source:coverage.c
        -:    0:Graph:coverage.gcno
        -:    0:Data:coverage.gcda
        -:    0:Runs:1
        -:    1:#include <stdio.h>
        -:    2:#include <stdlib.h>
        -:    3:#include <time.h>
        -:    4:
        1:    5:int main(){
        -:    6:
        1:    7:    srand(time(NULL));
        -:    8:
        1:    9:    int count = 0;
        -:   10:
       28:   11:    for(;;){
       29:   12:        int random_number = rand() % 100;
        -:   13:
       29:   14:        if(random_number > 95)
        1:   15:            break;
       28:   16:        else if(random_number > 100)
    #####:   17:            continue;
        -:   18:        else
       28:   19:            count++;
        -:   20:    }
        1:   21:    printf("count : %d\n", count);
        -:   22:
        -:   23:}
*/
  • 가장 왼쪽 숫자는 해당라인 실행횟수이며 #####은 미실행 라인

gcovr

  • gcov 파일을 시각화 하여 파싱해주는 툴
gcovr --html-details -r . --html coverage.html
gcovr -r . --csv coverage.csv
gcovr -r . --json coverage.json

 

 

'리눅스' 카테고리의 다른 글

Transparent Huge Page  (0) 2024.03.20
get realtime output of ssh remote command  (0) 2023.11.08
Core dump not generated  (0) 2023.06.13
Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04

+ Recent posts