【问题标题】:Getting the sequence of Gcov's executed lines information获取Gcov执行行信息的顺序
【发布时间】:2018-10-10 03:45:30
【问题描述】:

我正在尝试获取测试用例执行的代码行序列。通过使用 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,循环体将被迭代两次,其中iftrue 分支在第一次迭代中执行,然后false 分支在第二次迭代中执行。在这个例子中,我想要获取的关于执行行序列的信息类似于...-8-9-10-11-12-13-14-15-8-9-17-18-19-20-...

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

有没有办法用 Gcov 获取执行行的顺序?或者有没有其他方法可以做到这一点?谢谢

【问题讨论】:

    标签: c testing gcc gcov


    【解决方案1】:

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

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

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

    b main
    r
    while 1
    s
    end
    

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

    【讨论】:

    • 我认为这对于我想要实现的东西来说太复杂了。为了澄清事情,我想要在执行输入时显示行执行顺序的东西。 (如果事情变得更加混乱,我很抱歉。我不能很好地表达我的想法,尤其是英语)
    • 那你也许可以使用 GDB 脚本?
    • 我也在考虑这个问题。我会进一步研究它。
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多