c - 即使程序中止,如何强制 gcov 提取数据

标签 c gcov klee

我正在使用名为 KLEE 的测试生成工具,它为我的 C99 代码创建了大量测试。 之后我运行测试并使用 gcov 检查线路覆盖率。 Gcov 似乎在成功完成后在运行结束时更新覆盖率数据。

但是,一些测试失败(断言语句不正确),这会导致程序中止并且 gcov 不会计算此次运行中涵盖的行数。

gcov 是否可以在任何退出时刷新信息(不仅是在成功时)?

最佳答案

在断言代码中调用 void __gcov_flush(void)(来自 libgcov.a,它由编译器的 -fprofile-arcs 选项链接),就在 kill 和应用程序(例如,将 abort(); 更改为 __gcov_flush();abort();)。这将调用一个 gcov_exit 函数(它在 libgcov 中静态定义)。 gcov_exit 是将收集到的覆盖率保存到文件中的主要功能。它由 __gcov_init 使用 atfork() 注册;并且您的断言会在终止应用程序时忽略 atfork。

解决此问题的另一种方法是找出为什么您的断言会忽略 atfork() 注册的函数。

关于c - 即使程序中止,如何强制 gcov 提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6699712/

相关文章:

c++ - 在 64 位 x86 机器中读/写双值是原子的

c - 使用recv读取未知数据大小

gcc - gcov 符号在哪里?

linux - 关于 Linux 内核中的 gcov 输出?

c++ - 为什么当klee执行Objectfile时sleep()函数不能工作?

c - KLEE WARNINGS 并且没有生成任何输入

linux - 检查 C LLVM Bitcode 编译器是否工作.../xxx/llvm-3.4/Release+Asserts/bin/llvm-dis : Invalid type for value

c - 格式化打印到循环缓冲区

c - 丑陋的 C 结构分配的现代 C++ 模式

c - 解释函数调用的分支覆盖率