2010-04-07 3 views

답변

32

실행 파일에 연결하려는 개체 중 하나가 크게 변경되는 경우 발생합니다. 예를 들어, profilable 코드의 일부 라인을 얻거나 잃습니다.

오류를 생성하는 최소한의 경우는 2 개의 원본 파일입니다. 다음은이 개 예제 소스의 main.c라는 파일 ...

/* main.c */ 
int do_stuff(int value); 

int main(int argc, const char *argv[]) 
{ 
    do_stuff(argc); 
    return 0; 
} 

및 stuff.c

/* stuff.c */ 
#include <stdio.h> 

#if 0 
int more_stuff() 
{ 
    int i; 
    i = 0; 
    return i; 
} 
#endif 

int do_stuff(int value) 
{ 
    if (value > 1) { 
     printf("Value > 1\n"); 
    } else { 
     printf("Value <= 1\n"); 
    } 
    return 0; 
} 

그들이 할 것은 중요하지 않습니다이다. 컴파일이 main.c -> main.o, stuff.c -> stuff.o 마지막 stuff.o + main.o -> testexe 수 있도록

CFLAGS := -fprofile-arcs -ftest-coverage 
LDFLAGS := -fprofile-arcs -ftest-coverage 

testexe: main.o stuff.o 
    $(CC) $(LDFLAGS) -o [email protected] $^ 

Makefile을이 설정 : 여기를 구축하는 것은 간단한 메이크입니다. 이 C 파일을 -fprofile-arcs -ftest-coverage 옵션으로 컴파일하고 링크하면 실행 파일에 프로파일 링이 있습니다. 실행 파일을 실행하면 main.gcdastuff.gcda의 2 개의 출력 파일이 생성됩니다. 여태까지는 그런대로 잘됐다.

이제 #if 0 줄을 #if 1으로 변경하십시오. Makefile은 단지 stuff.c가 재 컴파일되도록하고, 실행 파일은 다시 링크하도록해야한다. 다음 번에 테스트 실행 파일이 실행되면 main.gcda 파일에 대해 "병합 불일치"메시지가 표시됩니다. stuff.gcda 파일은 오브젝트 파일이 모든 새로운 요약 정보로 다시 작성되었으므로 영향을받지 않습니다. main.c을 다시 컴파일하고 실행 파일을 다시 링크하면 오류 메시지가 사라집니다.

그래서 무엇을 할 수 있습니까? 나는 알고 싶다! 현재로서는 적용 범위를 다시 확인해야 할 때마다 find . -name '*.gcda' | xargs rm을 실행합니다. 이는 실제로 이상적이지 않습니다. 또 다른 해결책은 "just in case"프로파일 링을 사용할 때 모든 것을 다시 컴파일하는 것이지만 과도한 것처럼 보입니다.

+1

정보를 제공해 주셔서 감사합니다. 마침내 여기서 무슨 일이 벌어지고 있는지 이해하는 것이 좋습니다. 훌륭한 설명도. 유사한 해결 방법을 사용했습니다. 실행하기 전에 생성 된 모든 파일을 삭제했습니다. 나는 왜 이것이 작동하는지 이해하지만 오류 메시지가 다소 개선 될 수 있다고 생각합니다. – mikelong