首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >度量python过程中调用的C库的覆盖率

度量python过程中调用的C库的覆盖率
EN

Stack Overflow用户
提问于 2011-05-01 08:39:09
回答 1查看 433关注 0票数 3

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

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

代码语言:javascript
复制
#include <stdio.h>

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

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

这是python代码,调用它:

代码语言:javascript
复制
#!/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文件。问题是它只包含bar函数的覆盖号,该函数在python分叉之前被调用。如果在python的处理调用之外也调用了foo,那么一切都是好的。

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

代码语言:javascript
复制
        -:    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覆盖率数据在哪里?”

关于环境的更多细节:

4.1.2-46)

  • CMake
  • CentOS 5.4
  • gcc: 4.1.2 20080704 (Red
  • build (版本2.8.0)
  • python 2.5
  • python to C)使用SIP4.7.4版)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-02 11:03:03

问题是python的处理库是使用os._exit退出的。这是一个问题,因为以这种方式退出并不会调用流程的常规清理处理程序。结果是,该工具收集缓冲区中的覆盖数据,并只在进程退出时将其写入,并在常规流程清理处理程序中这样做。由于这些交互,子进程从未有机会编写其数据,而对foo的调用也从未被写入。

为了解决这个问题,我将在进程结束之前手动调用__gcov_flush。因为这是一个静态库,所以只需要一个小的C存根。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5847407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档