即使程序中止,如何强制 gcov 提取数据
我正在使用一个名为 KLEE 的测试生成工具,它为我的 C99 代码创建了大量测试。 然后我运行测试并使用 gcov 检查线路覆盖率。 Gcov 似乎会在成功完成运行结束时更新覆盖数据。
但是,某些测试会失败(断言语句不正确),这会导致程序中止,并且 gcov 不会计算本次运行中涵盖的行数。
gcov 有什么方法可以在任何退出时刷新信息(不仅仅是成功时)?
I'm using a test-generating tool called KLEE, that creates lots of tests for my C99-Code.
Afterwards I run the tests and check line coverage with gcov.
Gcov seems to update coverage data at the end of the run upon successful completion.
However, some tests fail (assert statements that are not true), which leads to aborting the program and gcov not counting the lines covered in this run.
Is there any way that gcov flushes information on any exit (not only on successful)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在断言代码中调用 void __gcov_flush(void) (来自 libgcov.a,由编译器的 -fprofile-arcs 选项链接),就在终止和应用程序之前(例如将
abort();
更改为__gcov_flush();abort();
)。这将调用 gcov_exit 函数(它在 libgcov 中静态定义)。 gcov_exit 是将收集的覆盖率保存到文件中的主要函数。它由 __gcov_init 使用atfork()
注册;并且您的断言在杀死应用程序时会忽略 atfork。解决这个问题的另一种方法是找出为什么你的断言会忽略
atfork()
注册的函数。Call
void __gcov_flush(void)
(from libgcov.a which is linked in by-fprofile-arcs
option of compiler) in your assert code, just before killing and application (e.g. changeabort();
into__gcov_flush();abort();
). This one will call an gcov_exit function (it is statically defined in libgcov). gcov_exit is the main functions to save collected coverage into file. It is registered by __gcov_init withatfork()
; and your assert ignores atfork when kills an application.Another way of solving this is to find why your assert ignores
atfork()
-registered functions.