gcov 메시지 "요약에 대한 병합 불일치"가 무슨 뜻인지 알 수 있습니까? 나는 여기 GCC 소스에서 메시지를 발견 :gcov 경고 : 요약에 대한 병합 불일치
http://www.opensource.apple.com/source/gcc/gcc-5646/gcc/libgcov.c
IT는 .gcda
파일의 태그가 일치하는지 전성 검사 것 같다,하지만 난 모르겠어요. 누구든지이 문제를 해결하는 방법을 알고 있습니까?
gcov 메시지 "요약에 대한 병합 불일치"가 무슨 뜻인지 알 수 있습니까? 나는 여기 GCC 소스에서 메시지를 발견 :gcov 경고 : 요약에 대한 병합 불일치
http://www.opensource.apple.com/source/gcc/gcc-5646/gcc/libgcov.c
IT는 .gcda
파일의 태그가 일치하는지 전성 검사 것 같다,하지만 난 모르겠어요. 누구든지이 문제를 해결하는 방법을 알고 있습니까?
실행 파일에 연결하려는 개체 중 하나가 크게 변경되는 경우 발생합니다. 예를 들어, 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.gcda
및 stuff.gcda
의 2 개의 출력 파일이 생성됩니다. 여태까지는 그런대로 잘됐다.
이제 #if 0
줄을 #if 1
으로 변경하십시오. Makefile은 단지 stuff.c가 재 컴파일되도록하고, 실행 파일은 다시 링크하도록해야한다. 다음 번에 테스트 실행 파일이 실행되면 main.gcda 파일에 대해 "병합 불일치"메시지가 표시됩니다. stuff.gcda 파일은 오브젝트 파일이 모든 새로운 요약 정보로 다시 작성되었으므로 영향을받지 않습니다. main.c
을 다시 컴파일하고 실행 파일을 다시 링크하면 오류 메시지가 사라집니다.
그래서 무엇을 할 수 있습니까? 나는 알고 싶다! 현재로서는 적용 범위를 다시 확인해야 할 때마다 find . -name '*.gcda' | xargs rm
을 실행합니다. 이는 실제로 이상적이지 않습니다. 또 다른 해결책은 "just in case"프로파일 링을 사용할 때 모든 것을 다시 컴파일하는 것이지만 과도한 것처럼 보입니다.
정보를 제공해 주셔서 감사합니다. 마침내 여기서 무슨 일이 벌어지고 있는지 이해하는 것이 좋습니다. 훌륭한 설명도. 유사한 해결 방법을 사용했습니다. 실행하기 전에 생성 된 모든 파일을 삭제했습니다. 나는 왜 이것이 작동하는지 이해하지만 오류 메시지가 다소 개선 될 수 있다고 생각합니다. – mikelong