2014-06-20 4 views
1

gcov가 클래스 메서드의 인라인 정의를 실행 가능 행으로보고하지 않는 것 같습니다. 예 : 나는 g++ -g -O0 -ftest-coverage -fprofile-arcs -o main main.cpp으로 위의 프로그램을 컴파일하는 경우gcov가 클래스의 함수 정의를 실행 가능하지 않은 것으로보고하는 이유는 무엇입니까?

#include <iostream> 

struct Foo { 
    void bar() {} 
    void baz() {} 
}; 

int main() { 
    Foo foo; 
    foo.bar(); 
} 

, 나는 다음과 같은 보고서를 얻을, 실행, 그 위에 gcov를 호출

 -: 0:Source:main.cpp 
     -: 0:Graph:main.gcno 
     -: 0:Data:main.gcda 
     -: 0:Runs:1 
     -: 0:Programs:1 
     -: 1:#include <iostream> 
     -: 2: 
     -: 3:struct Foo { 
     1: 4: void bar() {} 
     -: 5: void baz() {} 
     -: 6:}; 
     -: 7: 
     1: 8:int main() { 
     -: 9: Foo foo; 
     1: 10: foo.bar(); 
     4: 11:} 

왜 비 실행으로 라인 (5)보고를, 위의 방법이 올바르게 실행 된 것으로보고 되었더라도?

업데이트

는 gcov의 문서 (https://gcc.gnu.org/onlinedocs/gcc/Invoking-Gcov.html#Invoking-Gcov)에 따르면, - 실행하지만 아니었다 수 #####====마르크 라인 동안 비 실행 선이다.

+1

gcov는'bar()'가 실행되었고'baz()'가 실행되지 않았다는 것을 알려줍니다. 맞아요. 나는 당신의 질문을 오해합니까? –

+0

@Drew Dorman 귀하의 의견을 해결하기 위해 질문을 업데이트했습니다. –

+0

라인이 실행 가능합니까? 나는 결코 호출되지 않는 함수가 최종 바이너리에서 생략되었다고 상상한다. – hvd

답변

2

gcov가 바이너리를 연결 한 후 을보고하면 Foo::baz()이 실행될 가능성이 전혀 없습니다.

링커가 해당 기능을 완전히 제거 했으므로 더 이상 해당 줄과 연관된 코드가 실행 가능하지 않았습니다.

+0

오! 고마워요! 이런 종류의 동작을 막는 플래그를 알고 링커가 모든 함수를 포함하도록 만드시겠습니까? –

+1

나는 링커에게 보낸'--whole-archive'라고 믿는다. –

+0

감사! 그러나 링커가 문제가 아닌 것처럼 보입니다. 컴파일 할 때 ('-c') 단지'baz'가 이미 오브젝트 파일에서 빠져 있습니다. 어떻게 내가 이것을 막을 수 있는지 아는가? –