http://www.ibm.com/developerworks/cn/linux/l-cn-gdb/index.html
级别: 中级
刘 明 (ovis_poly@sina.com), 软件工程师, 上海交通大学电子与通信工程系
2007 年 11 月 22 日
测试工程师经常面对的一个问题就是如何获得测试的代码覆盖率。很多专业软件可以提供这种专门的代码覆盖率检测。通过对 GDB 的小小改造,也可以令其提供代码覆盖率测试功能。这种改动与平台无关,只要 GDB 支持的平台,都可以运行。
熟悉 Excel 的程序员都知道,Excel 不仅是一个应用软件,还能作为一个开发平台。这不仅是因为 Excel 提供了 VBA,更重要的是 Excel 本身处理了数据库连接,数据处理以及报表生成等复杂的工作。程序员从而避免了自己实现这些功能的负担。
同样,我们认为 gdb 本身的强大功能也使得它可以成为一个开发平台,充分利用它的符号处理能力和进程控制功能,我们可以开发出一些新的功能。
测试工程师经常面对的一个问题就是如何获得测试的代码覆盖率。很多专业软件可以提供这种专门的代码覆盖率检测。通过对 GDB 的小小改造,也可以令其提供代码覆盖率测试功能。这种改动与平台无关,只要 GDB 支持的平台,都可以运行。
GDB的一个基本功能就是单步运行程序,我们想到,如果在每次单步运行的时候,记录下运行过的代码数量,将此数据与总代码段长度比较,不就可以获得代码覆盖率了吗?
最 初的想法很简单,但是让测试人员不停地单步执行显然是不现实的,因此我们扩充了基本的gdb命令,增加了一条命令叫做covertest。该命令不断地自 动调用单步执行命令,并在每一个单步命令之后,记录下运行过的代码行数。直到程序运行结束。然后covertest命令读取ELF文件头,得到总的代码段 长度。最后,用记录下的运行过的代码数量除以总的代码段长度,从而得到代码覆盖率。
经过几周的调试,我们在RedHat9.0/x86平台上,修改GDB5.3,成功地实现了代码覆盖率测试功能。
我们把代码覆盖率定义为运行过的代码长度除以程序总的代码长度。
代码长度是二进制代码长度。而不是在C源文件中的代码长度。比如一条赋值语句在C语言中就是一条语句,但是编译为汇编语言后可能是一条,也可能是多条汇编指令。而且在Intel IA处理器中,指令长度是可变的。因此我们所说的代码长度是指最终的二进制代码的字节长度。
这种定义可能不是最佳的定义.但是是最容易实现的定义。在本文中,代码覆盖率采用机器指令长度作为衡量标准。
下面的例子比较了不同的代码长度的定义:
gdb是一个命令行工具,它基本的工作模式类似Shell。接收用户输入的命令然后执行相应的处理函数。gdb中CLI(command line interface)子系统负责用户界面的工作,它显示提示符,接收用户输入,分析用户输入并调用相应的处理函数。
CLI子系统的设计非常完善,它为用户添加新命令提供了几个专门函数。add_com()就是最基本的一个。它有四个入口参数,第一个参数是命令的名字,类型为字符串;第二个参数表明该命令的类型;第三个参数是该命令的处理函数,第四个参数是关于该命令的帮助说明。:
|