2011-05-01 5 views
1

파이썬에서 라이브러리 코드를 호출하는 예제부터 시작해 보겠습니다. 파이썬 프로세스에서 호출 된 C 라이브러리의 적용 범위 측정

은 (라이브러리 libfoolib로 컴파일) 라이브러리 코드 :

#include <stdio.h> 

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

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

그리고이 그것을 호출하는 파이썬 코드 :

#!/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 파일을 생성하고 파이썬 코드가 실행될 때 gcda 파일도 생성됩니다. 문제는 파이썬의 분기 전에 호출 된 bar 함수에 대한 적용 범위 번호 만 포함한다는 것입니다. foo도 파이썬의 처리 호출 외부에서 호출 되었다면 모두 좋다.

내가 생산 범위의 데이터에 대한 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)
  • C에
  • 파이썬 2.5
  • 파이썬

답변

0

문제는 일이다 SIP (버전 4.7.4)를 사용하여 파이썬의 처리 라이브러리에서 os._exit을 사용하여 종료됩니다. 이런 식으로 종료하면 프로세스의 일반 정리 처리기를 호출하지 않기 때문에 이것은 문제입니다. 계측기는 버퍼에있는 커버리지 데이터를 수집하여 프로세스 종료시에만 기록하고 일반 프로세스 정리 핸들러에서는 커버리지 데이터를 기록합니다. 이러한 상호 작용 때문에 자식 프로세스는 결코 데이터를 쓸 기회가 없으며 foo의 호출은 결코 기록되지 않습니다.

이 문제를 해결하려면 프로세스가 끝나기 전에 __gcov_flush을 수동으로 호출해야합니다. 그리고 이것은 정적 라이브러리이므로 그 작업을 위해 작은 C 스텁이 필요합니다.