2015-02-09 40 views
2

我在为我的一个项目生成覆盖率报告时遇到了麻烦 - 似乎在分叉之后的子进程中的线路从未被击中,尽管它们显然是在现实中。如何使用gcov/lcov为fork()的孩子生成覆盖率报告?

以下是分叉部分的coveralls report(结果与lcov + genhtml相同)和build logs

该项目使用自动工具与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%覆盖。

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

回答

4

后,当我再次研究这个问题有一段时间,我能够追查:

我用_exit()终止子进程,且对过程绕过任何定稿的财产,并与它的电话__gcov_flush() - 这就是为什么我没有得到任何报道。

相关问题