如何使用gcov / lcov生成fork()’d孩子的覆盖率报告?

我无法为我的项目生成覆盖率报告 – 看起来叉子之后的子进程中的线路从未被击中,尽管它们显然已经实际存在。

这是分叉部分的工作服报告 (结果与lcov + genhtml相同)和构建日志 。

该项目使用带有libtool的autotools进行构建,并将所有内容打包为静态库。 ( configure.ac , library makefile.am , tests makefile.am )

我试图将覆盖标志添加到测试中,并且--coverage在CFLAGS中添加 – 但无济于事。

最让我烦恼的是我试图在一个简单的C文件上重现行为,如下所示:

 #include  #include  #include  #include  int main(void) { pid_t pid; if (!(pid = fork())) { puts("In child"); } else { puts("In parent"); waitpid(pid, NULL, 0); } return 0; } 

使用以下shell会话:

 /bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I./src -Wall -Wextra -Wno-unused-result -Wno-missing-field-initializers -std=gnu99 -fplan9-extensions -I./include/ -I./dependencies/csptr/include/ -O0 --coverage -fprofile-arcs -ftest-coverage -g -O0 -MT test.lo -MD -MP -MF test.Tpo -c -o test.lo test.c /bin/sh ./libtool --tag=CC --mode=link gcc -Wall -Wextra -Wno-unused-result -Wno-missing-field-initializers -std=gnu99 -fplan9-extensions -I./include/ -I./dependencies/csptr/include/ -O0 --coverage -fprofile-arcs -ftest-coverage -g -O0 -lgcov -o test -rpath /usr/local/lib test.lo #The two lines above are adapted versions of what autotools with libtool run to compile my project. ./test mkdir -p coverage lcov --compat-libtool --directory . --capture --output-file cov.info && genhtml -o coverage cov.info 

…但生成的报告宣布100%的覆盖率。

怎么了 ? 我的构建坏了吗?

经过一段时间我重新调查了这个问题,我能够追踪它:

我正在使用_exit()来终止子进程,并且它具有绕过进程的任何终结的属性,并且使用它来调用__gcov_flush() – 这就是为什么我没有获得任何覆盖。