gpt4 book ai didi

python - 测量在 python 进程中调用的 C 库的覆盖率

转载 作者:太空狗 更新时间:2023-10-29 11:20:29 24 4
gpt4 key购买 nike

让我从示例开始 - 从 python 调用库代码。

这是库代码(编译成库 libfoolib):

#include <stdio.h>

void bar()
{
printf("bar\n");
}

void foo()
{
printf("foo\n");
}

这是调用它的 python 代码:

#!/usr/bin/python25
import sys
import libfoolib
import processing

def callFoo():
libfoolib.foo()

libfoolib.bar()

process = processing.Process(target=callFoo)
process.start()

当使用 -ftest-coverage-fprofile-arcs 编译库时,编译器正确生成 gcno 文件,当 python 代码执行 gcda 文件也会生成。问题是它只包含在 python fork 之前调用的 bar 函数的覆盖率数字。如果 foo 也在 python 的处理调用之外被调用,那么一切都很好。

这是我在生成的覆盖数据上运行 gcov 工具时得到的结果:

        -:    0:Source:/codeCoverageTests/pythonSIP/foo.c
-: 0:Graph:debug/CMakeFiles/fooLib.dir/foo.c.gcno
-: 0:Data:debug/CMakeFiles/fooLib.dir/foo.c.gcda
-: 0:Runs:4
-: 0:Programs:1
-: 1:#include <stdio.h>
-: 2:
-: 3:void bar()
function bar called 4 returned 100% blocks executed 100%
4: 4:{
4: 5: printf("bar\n");
call 0 returned 100%
4: 6:}
-: 7:
-: 8:void foo()
function foo called 0 returned 0% blocks executed 0%
#####: 9:{
#####: 10: printf("foo\n");
call 0 never executed
#####: 11:}
-: 12:

我的问题是“我的 foo 覆盖率数据在哪里?”

关于环境的更多细节:

  • 中央操作系统 5.4
  • gcc:4.1.2 20080704(红帽 4.1.2-46)
  • CMake 构建(版本 2.8.0)
  • python 2.5
  • python to C 使用 SIP(​​版本 4.7.4)

最佳答案

问题是 python 的处理库正在使用 os._exit 退出。这是一个问题,因为以这种方式退出不会调用进程的常规清理处理程序。事实证明,检测在缓冲区中收集覆盖率数据并仅在进程退出时写入它,并且它在常规进程清理处理程序中执行此操作。由于这些交互,子进程永远没有机会写入其数据,并且永远不会写入 foo 的调用。

为了解决这个问题,我在流程结束前手动调用了 __gcov_flush。由于这是一个静态库,因此需要一个小的 C stub 来完成这项工作。

关于python - 测量在 python 进程中调用的 C 库的覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5847407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com