21

gcov メッセージの "Merge mismatch for summary" の意味を誰か教えてもらえますか? ここのgccソースでメッセージを見つけました:

http://www.opensource.apple.com/source/gcc/gcc-5646/gcc/libgcov.c

ファイル内のタグが一致するかどうかのサニティ チェックのよう.gcdaですが、よくわかりません。誰でもこれを回避する方法を知っていますか?

4

1 に答える 1

35

これは、実行可能ファイルにリンクしているオブジェクトの 1 つが大幅に変更された場合に発生します。たとえば、プロファイリング可能なコードのいくつかの行を獲得または喪失します。

エラーが発生する最小のケースは、2 つのソース ファイルの場合です。main.c と呼ばれる 2 つのソース ファイルの例を次に示します。

/* 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;
}

彼らが何をするかは重要ではありません。それらをビルドするための簡単な Makefile は次のとおりです。

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

testexe: main.o stuff.o
    $(CC) $(LDFLAGS) -o $@ $^

Makefile は、コンパイルがmain.c -> main.o,stuff.c -> stuff.oそして最終的にstuff.o + main.o -> testexe. これらの C ファイルを-fprofile-arcs -ftest-coverageオプションを使用してコンパイルおよびリンクすると、実行可能ファイルにプロファイリングが含まれます。その実行可能ファイルを実行すると、2 つの出力ファイルmain.gcdastuff.gcda. ここまでは順調ですね。

ここで、行#if 0を に変更し#if 1ます。Makefile によって、stuff.c だけが再コンパイルされ、実行可能ファイルが再リンクされます。次にテスト実行可能ファイルを実行すると、main.gcdaファイルに対して「マージの不一致」というメッセージが表示されます。オブジェクト ファイルがすべての新しい概要情報で再作成されているため、stuff.gcda ファイルは影響を受けません。実行可能ファイルを再コンパイルmain.cして再リンクすると、エラー メッセージは表示されなくなります。

では、何ができるでしょうか?ぜひ知りたいです!現時点find . -name '*.gcda' | xargs rmでは、カバレッジを再チェックする必要があるたびに実行していますが、これは理想的ではありません。別の解決策は、「念のため」プロファイリングを使用するときにすべてを再コンパイルすることですが、それはやり過ぎのようです。

于 2010-04-20T20:25:19.693 に答える