2011-05-01 56 views
1

讓我先從例子 - 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功能,被蟒蛇的分叉之前調用覆蓋號碼。如果foo也被稱爲Python的處理通話之外,那麼一切都很好。

這是我所得到的,當我運行對所產生的覆蓋數據gcov工具:「哪裏是我的foo覆蓋數據」

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

我已經是問題

關於環境的一些細節:

  • 的CentOS 5.4
  • GCC 4.1.2 20080704(紅帽4.1.2-46)
  • CMake的構建(2.8.0版)
  • 蟒2.5
  • 蟒至C使用SIP(4.7.4版本)

回答

0

的問題是第在python的處理庫正在使用os._exit退出。這是一個問題,因爲以這種方式退出不會調用進程的常規清理處理程序。事實證明,儀器收集緩衝區中的覆蓋率數據,並只寫入進程退出,並在常規進程清理處理程序中執行。由於這些交互,子進程永遠沒有機會寫入其數據,並且foo的調用永遠不會寫入。

爲了解決這個問題,我在過程結束之前手動撥打__gcov_flush。由於這是一個靜態庫,因此需要一個用於該作業的小型C存根。