我在为我的一个项目生成覆盖率报告时遇到了麻烦——似乎在一个分叉之后的子进程中的行从未被击中,尽管它们显然是在现实中。
这是分叉部分的coveralls report(结果与lcov+genhtml相同)和build logs
该项目使用带有libtool的autotools来构建,并将所有内容打包为静态库。(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%的覆盖率。
怎么了?我的身材破了吗?

最佳答案

经过一段时间的重新调查,我终于找到了问题:
我使用了_exit()来终止子进程,它具有绕过进程上的任何终结的属性,并通过它调用__gcov_flush()——这就是为什么我没有得到任何覆盖。

关于c - 如何使用gcov/lcov为fork()的 child 生成覆盖率报告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28408811/

10-11 23:01
查看更多