如何使用gcov/lcov为fork()的子进程生成覆盖率报告?

6

我在为我的一个项目生成覆盖率报告时遇到了困难--似乎fork之后子进程中的代码行从未被执行,但实际上它们确实被执行了。

这是forking部分的覆盖率报告(使用lcov+genhtml的结果相同),以及构建日志

该项目使用autotools和libtool进行构建,并将所有内容打包成静态库。(configure.aclibrary makefile.amtests makefile.am

我尝试将覆盖率标志添加到测试中,以及在CFLAGS中添加--coverage,但都没有成功。

最让我困扰的是,我试图在一个简单的C文件中重现这种行为,如下所示:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

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%。

有什么问题吗?我的构建出了问题吗?

1个回答

14
在重新调查了一段时间后,我成功地找到了问题所在: 我使用_exit()来终止子进程,该函数具有绕过进程上的任何最终化操作并绕过对__gcov_flush()的调用的属性——这就是为什么我没有得到任何测试覆盖率的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接