gcov未生成gcda文件

gcov未生成gcda文件,c,gcov,C,Gcov,注:本文件可被视为以下文件的副本: 这个问题没有答案 我不认为OP有和我一样的系统,所以我不认为我去编辑他的问题就可以了。此外,问题是5yo 我在这里给出了一个“最小”且可复制的示例 所以,我试图重现我在gcov中遇到的一个错误…我运行了另一个。以下是一些文件: 主要条款c: #包括 #包括 #包括 #包括“modeAlpha.c” //~#包括“modeBeta.c” //~#包括“modeGamma.c” int main(){ char MyText[256]; printf(“你好!这是

注:本文件可被视为以下文件的副本:

  • 这个问题没有答案
  • 我不认为OP有和我一样的系统,所以我不认为我去编辑他的问题就可以了。此外,问题是5yo
  • 我在这里给出了一个“最小”且可复制的示例
  • 所以,我试图重现我在gcov中遇到的一个错误…我运行了另一个。以下是一些文件:

    主要条款c:

    #包括
    #包括
    #包括
    #包括“modeAlpha.c”
    //~#包括“modeBeta.c”
    //~#包括“modeGamma.c”
    int main(){
    char MyText[256];
    printf(“你好!这是一个gcov测试。在这里输入一些单词:”);
    scanf(“%s”,MyText);
    printf(“这是您的文本:%s\n”,MyText);
    模式\写入\字母(MyText);
    //~mode_write_Beta(MyText);
    模式_wait_Alpha();
    //~mode_free_Beta(MyText);
    //~mode_end_Beta();
    }
    
    modeAlpha.c:

    #ifdef modeAlpha
    #包括“modeAlpha.h”
    #包括“AlphaFunctions.c”
    #恩迪夫
    
    modeAlpha.h:

    \ifdef模式\u写入
    #未定义模式_写入
    #恩迪夫
    #定义模式写入模式写入阿尔法
    #ifdef模式\u等待
    #未定义模式\u等待
    #恩迪夫
    #定义模式\u等待模式\u等待\u Alpha
    #ifdef模式_自由
    #未定义模式\u自由
    #恩迪夫
    #定义模式\u自由模式\u自由\u阿尔法
    #ifdef模式\u结束
    #未定义模式\u结束
    #恩迪夫
    #定义模式\u结束模式\u结束\u Alpha
    #包括“modes.h”
    
    字母功能

    #包括
    #包括
    #包括
    #包括“modes.h”
    无效模式_写入(字符*字符串){
    printf(“Alpha写入您所说的内容:%s\n”,字符串);
    }
    无效模式_等待(){
    printf(“等待处理的Alpha”\n);
    }
    无效模式_free(字符*字符串){
    printf(“Alpha空闲内存\n”);
    自由(弦);
    }
    无效模式_end(){
    printf(“这是Alpha\n的结尾”);
    }
    
    模式h:

    void模式_写入(字符*测试);
    无效模式\等待(无效);
    无空隙模式(字符*测试);
    无效模式结束(无效);
    
    以及生成文件:

    GCOVOPT= -std=c99 --coverage -fprofile-arcs -ftest-coverage -fprofile-generate
    LDLIBS= -lpthread -lgcov
    LDFLAGS= -Wall -pedantic -g -g3 -ggdb $(GCOVOPT)
    CFLAGS= -c -Wall -pedantic -g -g3 -ggdb
    
    OBJS=MyProg.o modeAlpha.o 
    SRCS=main.c modeAlpha.c 
    
    MODEALPHA=modeAlpha
    MODEBETA=modeBeta
    MODEGAMMA=modeGamma
    
    MyProg: $(OBJS)
        gcc $(OBJS) $(LDFLAGS) $(LDLIBS) -o MyProg
        
    MyProg.o: main.c
        gcc -c $< -o $@ $(LDFLAGS) $(LDLIBS) -D$(MODEALPHA)
        
    modeAlpha.o: modeAlpha.c
        gcc -c $< -o $@ $(CFLAGS) $(LDLIBS) 
    
    GCOVOPT=-std=c99--覆盖率-fprofile弧-ftest覆盖率-fprofile生成
    LDLIBS=-lpthread-lgcov
    LDFLAGS=-Wall-pedantic-g-g3-ggdb$(GCOVOPT)
    CFLAGS=-c-墙-学究式-g-g3-ggdb
    OBJS=MyProg.o modeAlpha.o
    SRCS=main.c modeAlpha.c
    MODEALPHA=MODEALPHA
    MODEBETA=MODEBETA
    MODEGAMMA=MODEGAMMA
    MyProg:$(OBJS)
    gcc$(OBJS)$(LDFLAGS)$(LDLIBS)-o MyProg
    MyProg.o:main.c
    gcc-c$<-o$@$(LDFLAGS)$(LDLIBS)-D$(MODEALPHA)
    modeAlpha.o:modeAlpha.c
    gcc-c$<-o$@$(CFLAGS)$(LDLIBS)
    
    现在我知道这些文件可能感觉很奇怪,代码也很不完美,但请记住我试图重现另一个错误。尽管如此,这仍然可以正常工作,编译后生成.gcno文件,然后在执行prog后生成.gcda文件

    当我添加“modeBeta”时,问题出现了。我只需要一个modeBeta.c、BetaFunctions.c和modeBeta.h,它们与我在这里给出的完全相同,只是所有出现的单词“Alpha”都被替换为“Beta”。你可以看到一些主要的评论行,与modeBeta相关;我取消了它们的注释。最后更改了makefile,如下所示:

    生成文件:

    GCOVOPT= -std=c99 --coverage -fprofile-arcs -ftest-coverage -fprofile-generate
    LDLIBS= -lpthread -lgcov
    LDFLAGS= -Wall -pedantic -g -g3 -ggdb $(GCOVOPT)
    CFLAGS= -c -Wall -pedantic -g -g3 -ggdb
    
    OBJS=MyProg.o modeAlpha.o 
    SRCS=main.c modeAlpha.c 
    
    MODEALPHA=modeAlpha
    MODEBETA=modeBeta
    MODEGAMMA=modeGamma
    
    MyProg: $(OBJS)
        gcc $(OBJS) $(LDFLAGS) $(LDLIBS) -o MyProg
        
    MyProg.o: main.c
        gcc -c $< -o $@ $(LDFLAGS) $(LDLIBS) -D$(MODEALPHA)
        
    modeAlpha.o: modeAlpha.c
        gcc -c $< -o $@ $(CFLAGS) $(LDLIBS) 
    
    LDLIBS= -lpthread -lgcov
    LDFLAGS= -Wall -pedantic -g -g3 -ggdb $(GCOVOPT)
    CFLAGS= -c -Wall -pedantic -g -g3 -ggdb
    
    OBJS=MyProg.o modeAlpha.o modeBeta.o
    SRCS=main.c modeAlpha.c modeBeta.c
    
    MODEALPHA=modeAlpha
    MODEBETA=modeBeta
    MODEGAMMA=modeGamma
    
    MyProg: $(OBJS)
        gcc $(OBJS) $(LDFLAGS) $(LDLIBS) -o MyProg
        
    MyProg.o: main.c
        gcc -c $< -o $@ $(LDFLAGS) $(LDLIBS) -D$(MODEALPHA) -D$(MODEBETA)
        
    modeAlpha.o: modeAlpha.c
        gcc -c $< -o $@ $(CFLAGS) $(LDLIBS) 
        
    modeBeta.o: modeBeta.c
        gcc -c $< -o $@ $(CFLAGS) $(LDLIBS) 
    
    LDLIBS=-lpthread-lgcov
    LDFLAGS=-Wall-pedantic-g-g3-ggdb$(GCOVOPT)
    CFLAGS=-c-墙-学究式-g-g3-ggdb
    OBJS=MyProg.o modeAlpha.o modeBeta.o
    SRCS=main.c modeAlpha.c modeBeta.c
    MODEALPHA=MODEALPHA
    MODEBETA=MODEBETA
    MODEGAMMA=MODEGAMMA
    MyProg:$(OBJS)
    gcc$(OBJS)$(LDFLAGS)$(LDLIBS)-o MyProg
    MyProg.o:main.c
    gcc-c$<-o$@$(LDFLAGS)$(LDLIBS)-D$(MODEALPHA)-D$(MODEBETA)
    modeAlpha.o:modeAlpha.c
    gcc-c$<-o$@$(CFLAGS)$(LDLIBS)
    modeBeta.o:modeBeta.c
    gcc-c$<-o$@$(CFLAGS)$(LDLIBS)
    
    我仍然得到了.gcno文件,但在执行程序后没有更多的.gcda。 请注意,如果我没有在main中调用任何mode_XXX_Beta函数(比如,如果我没有取消main.c中注释行的注释),那么gcda文件将按其应该的方式生成

    知道这里发生了什么吗


    操作系统:我使用MinGW(winLib repo)和gcc 10.1.0在Win10 64位上运行。

    我发现了问题:mode_free_Beta正在释放未分配的内存,这导致程序结束时没有任何消息错误。所以我认为它运行得很好,但没有注意到我从未达到测试模式的事实

    程序非自然结束=没有gcda文件

    在这种情况下,只需使用

    char*MyText;
    MyText=(char*)malloc(256);
    
    如果这种情况发生在您身上,只需确保您的程序一直运行良好,直到结束;)