来协助测试,目的就是测试更充分,除了代码review等以外,我们也会借助代码覆盖率工具来捕捉测试遗漏。但是经常发现有一些分支永远或很难覆盖到,那这个时候怎么办呢?下面介绍下通过gdb调试来提升代码覆盖率尝试,做笔记的同时也跟有兴趣的同学分享下:
为了更形象的介绍,先上一段超简单的C代码,如下:
Test.cpp文件内容如下:
#include <stdio.h>
#include <iostream.h>
int main(int argc, char * argv[])
{
for(int i=0;i<argc;i++)
{
if (i<5) printf("The
%d param is %s\n",i,argv[i]);
else return -1;
}
int x=6;
if (x==6)
cout<<"x=6"<<endl;
else return -2;
return 0;
}
1. 首先先进行编译,g++ -o test test.cpp -g -fprofile-arcs -ftest-coverage,其中-g为使用gdb必须有的参数,-fprofile-arcs
-ftest-coverage为代码覆盖率必须有的
2. 编译完后生成test二进制文件和一个test.gcno文件
3. 然后先通过传参数的方式来覆盖
3.1../test a 来覆盖if (i<5) printf("The %d
param is %s\n",i,argv[i]);
3.2../test a b c d e f来覆盖else return -1;
4. 然后执行gcov test.cpp
[work@db-testing-bdcm03.db01.baidu.com learn]$ gcov test.cpp
File `/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/bits/locale_facets.tcc'
Lines executed:0.00% of 11
/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/bits/locale_facets.tcc:creating `locale_facets.tcc.gcov'
File `test.cpp'
Lines executed:90.00% of 10
test.cpp:creating `test.cpp.gcov'
File `/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/bits/stl_algobase.h'
Lines executed:0.00% of 4
/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/bits/stl_algobase.h:creating `stl_algobase.h.gcov'
File `/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/iostream'
Lines executed:100.00% of 1
/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/iostream:creating `iostream.gcov'
5. 可以看到覆盖了90%,具体可以编辑test.cpp.gcov
可以看到第17行没有覆盖到,因为上边一定定义了x=6,所以不可能出现其它的,那我们怎么办呢,如何覆盖呢
6. 好,gdb排上用场了
7. 执行gdb进入调试界面
8. 加载二进制文件,file test
9. 设置断点b main
10. 执行调起,r a b ------(r后可加参数也可以不加)
11. 执行n并回车,直到出现以下界面
(gdb)
16 if (x==6) cout<<"x=6"<<endl;
12. P x看一眼x是多少
13. 此时是最关键的,需要set x=8或者其它非6的数字
16 if (x==6) cout<<"x=6"<<endl;
(gdb) set x=8
(gdb) p x
$1 = 8
14. 然后,出现奇迹的时刻到来了,继续执行n
(gdb) n
17 else return -2;
(gdb)
19 }
覆盖了此代码行分支,按c执行到最后(否则不会更新代码覆盖率),并退出gdb
15. 接下来看看gcov代码覆盖率,执行gcov test.cpp
File `/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/bits/locale_facets.tcc'
Lines executed:0.00% of 11
/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/bits/locale_facets.tcc:creating `locale_facets.tcc.gcov'
File `test.cpp'
Lines executed:100.00% of 10
test.cpp:creating `test.cpp.gcov'
File `/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/bits/stl_algobase.h'
Lines executed:0.00% of 4
/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/bits/stl_algobase.h:creating `stl_algobase.h.gcov'
File `/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/iostream'
Lines executed:100.00% of 1
/usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/iostream:creating `iostream.gcov'
OK,终于大功告成:)