c - 如何使用 gcov/lcov 为 fork() 的 child 生成覆盖率报告?

标签 c fork code-coverage gcov lcov

我在为我的一个项目生成覆盖率报告时遇到了问题——似乎 fork 后子进程中的行从未被命中,尽管它们显然是真实存在的。

这是 coveralls report fork 部分(结果与 lcov+genhtml 相同),以及 build logs .

该项目使用带有 libtool 的 autotools 进行构建,并将所有内容打包为静态库。 ( configure.ac , library makefile.am , tests 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 session :

/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/

相关文章:

objective-c - Objective C 语法错误

c - 理解C语言中使用指针交换两个字符串

c - 为什么 fork() 的输出是特定顺序的?

c - 为什么我无法捕捉到 parent 发送的子进程的信号?

c - 如何 fork 并创建执行相同任务的特定数量的 child ?

java - 适用于 Solaris 的任何 Java 代码覆盖工具

在 C 中使用 strptime() 转换 "%y-%m-%d"失败

c++ - Ubuntu 不提供包含 uint24_t 类型的 Clang 的 stdint

python - 如何将程序启动代码 (__name__ == "__main__") 排除在 pytest 覆盖率报告之外?

c# - Lambda 表达式的代码覆盖率