gcov未生成gcda文件
注:本文件可被视为以下文件的副本:gcov未生成gcda文件,c,gcov,C,Gcov,注:本文件可被视为以下文件的副本: 这个问题没有答案 我不认为OP有和我一样的系统,所以我不认为我去编辑他的问题就可以了。此外,问题是5yo 我在这里给出了一个“最小”且可复制的示例 所以,我试图重现我在gcov中遇到的一个错误…我运行了另一个。以下是一些文件: 主要条款c: #包括 #包括 #包括 #包括“modeAlpha.c” //~#包括“modeBeta.c” //~#包括“modeGamma.c” int main(){ char MyText[256]; printf(“你好!这是
#包括
#包括
#包括
#包括“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);
如果这种情况发生在您身上,只需确保您的程序一直运行良好,直到结束;)