我正在使用名为 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/