使用gdb提升覆盖代码率

上一篇 / 下一篇  2014-04-23 14:09:50 / 个人分类:自动化测试

   近期一直在搞C++代码相关的测试,免不了会进行代码review或者单元测试来协助测试,目的就是测试更充分,除了代码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,终于大功告成:)


TAG:

 

评分:0

我来说两句

Open Toolbar