让我从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文件。问题是它只包含bar函数的覆盖号,该函数在python分叉之前被调用。如果在python的处理调用之外也调用了foo,那么一切都是好的。
这就是我在生成的覆盖率数据上运行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覆盖率数据在哪里?”
关于环境的更多细节:
4.1.2-46)
发布于 2011-05-02 11:03:03
问题是python的处理库是使用os._exit退出的。这是一个问题,因为以这种方式退出并不会调用流程的常规清理处理程序。结果是,该工具收集缓冲区中的覆盖数据,并只在进程退出时将其写入,并在常规流程清理处理程序中这样做。由于这些交互,子进程从未有机会编写其数据,而对foo的调用也从未被写入。
为了解决这个问题,我将在进程结束之前手动调用__gcov_flush。因为这是一个静态库,所以只需要一个小的C存根。
https://stackoverflow.com/questions/5847407
复制相似问题