7

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

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

有什么方法可以让 gcov 在任何退出时刷新信息(不仅在成功时)?

4

1 回答 1

7

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

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

于 2011-08-15T12:31:18.783 回答