获取Gcov执行行的信息序列

时间:2018-04-30 04:14:30

标签: c testing gcc gcov

我试图获取测试用例执行的代码行序列。通过使用Gcov,输出.gcov文件显示执行哪行代码以及执行它们的次数,但没有关于序列的信息。

问题在于我无法获得已执行行的序列。我们以此程序为例:

//...
for(i = 0; i < n; i++) { // line 8
    if(a > b) { // line 9
        // do something (line 10 - 15)
    } else { // line 16
        // do something (line 17 - 20)
    }
}
//...

例如,对于输入x,循环体将迭代两次,其中true分支在第一次迭代时执行,if分支在false分支上执行第二次迭代。在这个例子中,关于我想要获得的已执行行序列的信息将类似于...-8-9-10-11-12-13-14-15-8-9-17-18-19-20-...

使用Gcov,我无法获得上述信息,因为.gcov文件只会显示来自两个分支的所有行都被执行。我无法弄清楚第10-15行或第17-20行是否先执行。

有没有办法用Gcov获取执行行的序列?或者有没有其他选择吗?谢谢

1 个答案:

答案 0 :(得分:1)

gcov(和-fprofile-arcs)仅存储和处理原始数字,没有分支历史记录信息。您要查找的数据根本不可用。

American Fuzzy Lop有一种不同形式的仪器,涵盖了一些与路径相关的信息。请参阅technical description。你没有说出你真正想要达到的目标,所以也许这就足够了。

如果您需要捕获任何形式的执行跟踪,您可以使用这样的GDB脚本:

b main
r
while 1
s
end

需要进行一些后期处理,因为很难抑制不需要的GDB输出。要获得更精细的数据捕获,您可以使用GDB Python interface