gcov 是一個可用於C/C++的代碼覆蓋工具,是GCC的內建工具。
它的使用很簡單,需要在編譯和鏈接時增加-fprofile-arcs -ftest-coverage生成二進制文件。gcov主要使用.gcno和.gcda兩個文件,.gcno是由-ftest-coverage產生的,它包含了重建基本塊圖和相應的塊的源碼的行號的信息。.gcda是由加了-fprofile-arcs編譯參數的編譯後的文件運行所產生的,它包含了弧跳變的次數和其他的概要信息。
舉個例子:
有一個源文件main.cc:
/// @file main.cc
#include <cstdio>
void test(int num)
{
for(int i = 0; i < num; ++i)
printf("*");
printf("\n");
}
int main()
{
int num ;
scanf("%d", &num);
if (num <= 0) {
printf("num(%d) <= 0\n", num);
}
else for(int i = 1; i <= num; ++i) {
test(i);
}
return 0;
}
編譯-fprofile-arcs -ftest-coverage 會產生.gcno文件:
192:test lurongming$ gcc -fprofile-arcs -ftest-coverage main.cc -o main
192:test lurongming$ ls
main main.cc main.gcno
接下來運行可執行文件會產生.gcda文件:
192:test lurongming$ ./main
5
*
**
***
****
*****
192:test lurongming$ ls
main main.cc main.gcda main.gcno
用gcov生成代碼覆蓋信息,可以看到新增了main.cc.gcov文件:
192:test lurongming$ gcov main.cc
File 'main.cc'
Lines executed:83.33% of 12
main.cc:creating 'main.cc.gcov'
192:test lurongming$ ls
main main.cc main.cc.gcov main.gcda main.gcno
查看main.cc.gcov文件的信息:
192:test lurongming$ cat main.cc.gcov
-: 0:Source:main.cc
-: 0:Graph:main.gcno
-: 0:Data:main.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:/// @file main.cc
-: 2:
-: 3:#include <cstdio>
-: 4:
-: 5:void test(int num)
-: 6:{
40: 7: for(int i = 0; i < num; ++i)
15: 8: printf("*");
5: 9: printf("\n");
5: 10:}
-: 11:
-: 12:int main()
-: 13:{
-: 14: int num ;
1: 15: scanf("%d", &num);
-: 16:
1: 17: if (num <= 0) {
#####: 18: printf("num(%d) <= 0\n", num);
#####: 19: }
12: 20: else for(int i = 1; i <= num; ++i) {
5: 21: test(i);
5: 22: }
1: 23: return 0;
-: 24:}
被標記爲#####的代碼行就是沒有被執行過的,-表示無所謂執行的,其他數字表示執行的次數。