c - 获取Gcov的执行行信息的顺序

标签 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,循环体将迭代两次,其中 iftrue 分支在第一次迭代时执行,并且然后是第二次迭代的 false 分支。在这个例子中,我想要获得的关于执行行序列的信息将是这样的 ...-8-9-10-11-12-13-14-15-8-9-17 -18-19-20-...

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

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

最佳答案

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

American Fuzzy Lop有一种不同形式的检测,它涵盖了一些与路径相关的信息。查看technical description .您没有说出您实际想要实现的目标,所以也许这就足够了。

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

b main
r
while 1
s
end

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

关于c - 获取Gcov的执行行信息的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50093867/

相关文章:

c - 关于C中char和int指针的几点疑惑

unit-testing - Selenium Java 测试用例不工作

C: 动态链接 OpenSSL 库时出错

c - 在 C 中使用标准函数名称

c - gcc 未使用/读取 LIBRARY_PATH 环境变量

c - 父进程不会使用 signal() 等待所有子进程退出

c - 读取用户输入,但必须与 C 中的字符串/小数/字符区分开

c - 结构定义中的结构指针

ruby - minitest 可以做类似 "rspec --color --format doc"的事情吗?

testing - 合并来自多个项目 Gradle 构建的单元测试报告