본문 바로가기
정보보안/fuzzing

gcov, lcov 개념 및 사용하기

by meanjung 2022. 1. 26.

gcov 개념

  • code coverage를 측정하기 위해 사용하는 프로그램
  • 알 수 있는 것
    • 각 라인의 코드가 얼마나 자주 실행되었는가
    • 정확히 어떤 라인의 코드가 실행되었는가
    • 특정 부분의 코드를 실행하는데 얼만큼의 시간이 걸렸는가

gcov 사용법

  1. gcc의 특정 옵션과 함께 테스트하고자하는 프로그램 컴파일
    • -fprofile-arcs : 이 옵션으로 컴파일한 후, 프로그램을 실행하면 branch와 call이 얼마나 실행되었는지 그리고 리턴을 했는지 기록한다. 이 데이터는 .gcda 파일에 저장된다.
    • -ftest-coverage : 이 옵션으로 컴파일되면, gcov 프로그램이 프로그램의 coverage를 보여줄 때 사용하는 .gcno 파일을 생성한다. 
    • --coverage : -fprofile-arcs -ftest-coverage 옵션을 모두 준 것과 같다.  
    • 이 옵션들은 gcc가 프로그램의 flow graph를 포함한 gcov의 사용에 필요한 부가적인 정보를 생성하도록 할 수 있으며, 프로파일링 정보를 만들기 위한 사항들을 오브젝트 파일에 추가시킬 수 있다. 
    • gcc --coverage -o test test.c => [$ ls] test test.c test.gcno
  2. 컴파일한 프로그램 실행
    • ./test => [$ ls] test test.c test.gcno test.gcda
  3. gcov 프로그램으로 커버리지 정보 분석
    • .gcda, .gcno 파일을 활용해 .gcov 파일을 생성한다.
    • .gcov 파일을 해당 프로그램의 커버리지 정보를 담고있다. 
    • gcov test.c => [$ ls] test  test.c  test.c.gcov  test.gcda  test.gcno

./test를 또 실행하면 test.gcda가 업데이트된다.

gcov test.c를 다시 실행하면 test.c.gcov가 업데이트된다.

 


lcov 개념

  • gcov 결과를 웹 페이지를 통해 깔끔하게 보여주기 위해 lcov를 사용한다.

https://jayy-h.tistory.com/18

 

lcov, genhtml - coverage 정보를 깔끔한 웹 페이지로 만들기

lcov, genhtml을 이용한 coverage 깔끔하게 보기 NOTE 이전의 gocv를 이용한 커버리지 정보 확인과 밀접한 관계가 있는 글 입니다. 이 글을 풍부하게 이해하기 위해서는 gcov 관련 게시글을 보고 오시길 바

jayy-h.tistory.com


적용하기

0. AFL을 실행하면 crashes/ queue/ hang/에 mutated된 인풋 파일이 존재한다. 

 

1. binutils를 --coverage 옵션으로 컴파일한다.

CC=/usr/bin/gcc CXX=/usr/bin/g++ CFLAGS="--coverage" CXXFLAGS="--coverage" ./configure --prefix=`pwd`/build LIBS="-ldl"

make -j `nproc`

make install

 

< 하나만 먼저 실행해보기 >

2. objdump를 실행한다. 

[**] 이때 objdump는 build/bin 밑에 있는게 아니라 binutils 밑에 있는데서 실행한다. 

[**] 꼭 ./objdump로 실행해야 한다.

./objdump -x ../../../AFL/afl-2.52b/default_output/queue/id:001145\,src:000443\,op:flip1\,pos:15040

>> .gcno, .gcda 파일이 생성된 것을 볼 수 있다. 

 

3. gcov를 실행한다. 

gcov objdump.c

>> objdump.c.gcov가 생성됐다. 

 

< AFL output에 있는 모든 파일 실행하기 >

4. 이제 crashes/ queue/ hang/에 있는 모든 파일을 대상으로 objdump를 실행하는 쉘 스크립트를 작성한다.

이때 해당 파일들 모두 chmod +x * 해야하는 듯....

sh objdump_exec.sh

dirname="/home/mj/Desktop/AFL/afl-2.52b/default_output/"

for i in $(ls $dirname/queue/)
do
	echo `./objdump -x $dirname/queue/$i`
done

for i in $(ls $dirname/crashes/)
do
	echo `./objdump -x $dirname/crashes/$i`
done

for i in $(ls $dirname/hangs/)
do
	echo `./objdump -x $dirname/hangs/$i`
done

 

5. gcov objdump.c

>> cat objdump.c.gcov 로 확인할 수 있다. 

 

+ objdump* 파일을 다른 디렉터리에 복사했다... 6번 편하게 하려고..

 

 

6. lcov --rc lcov_branch_coverage=1 --capture --directory . --output-file objdump.info

 

7. genhtml objdump.info --branch-coverage --output-directory output

>> 5, 6, 7도 쉘스크립트로 자동화할 수 있을듯


출처

http://korea.gnu.org/manual/release/gcov/gcov_1.ko.html

 

gcov: 테스트 커버리지 프로그램

목차, 영문 gcov는 GNU CC와 함께 사용해서 프로그램에 대한 코드 커버리지(code coverage) 테스트를 수행할 수 있는 도구이다. 이 장에서는 gcov 버전 1.5를 대상으로 다음과 같은 사항들을 설명한다. gcov

korea.gnu.org

https://educoder.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99gcov%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BB%A4%EB%B2%84%EB%A6%AC%EC%A7%80-%EC%B8%A1%EC%A0%95

 

[소프트웨어 공학]gcov:테스트 커버리지 측정

gcov는 코드 커버리지를 측정하기 위해 사용하는 프로그램입니다. 코드 커버리지에 대한 내용은 여기서 간단하게 알 수 있습니다. gcov는 아래와 같은 것을 알려줍니다. - 각 라인의 코드가 얼마나

educoder.tistory.com

https://velog.io/@kongsub/GCOV-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0-Lab1-Triangle

 

GCOV 사용해보기 Lab1-Triangle

Software Testing & Fuzzing Camp Lab1triangle.c라는 c언어로 된 프로그램이 있다.이 프로그램은 총 3개의 integer를 받는데 각각의 integer는 삼각형의 변의 길이를 뜻한다.프로그램은 인풋으로 총 3개의 삼각형

velog.io

 

댓글