单次编译插桩文件触发libgcov时间戳profile覆盖错误原因
问题场景
与重复编译同一插桩文件触发的gcov报错场景不同,本次构建过程中每个文件仅编译一次,使用的编译命令如下:
g++ -c "file_1.c" -o file_1.o -fprofile-arcs -ftest-coverage g++ -c "file_2.c" -o file_2.o -fprofile-arcs -ftest-coverage g++ -c "file_3.c" -o file_3.o g++ file_1.o file_2.o file_3.o -lgcov --coverage
编译完成后运行生成的可执行文件./a.exe,控制台输出如下报错:
libgcov profiling error:file_1.gcda:overwriting an existing profile data with a different timestamp libgcov profiling error:file_2.gcda:overwriting an existing profile data with a different timestamp ...
核心疑问:未对插桩文件做重复编译,为什么仍然触发该libgcov报错?
报错原因
该报错的触发条件是当前运行的插桩程序内嵌的编译时间戳,和目标路径下已存在的.gcda文件中存储的时间戳校验不通过,和是否重复编译同一文件没有必然联系,最常见的触发原因是:
- 工作目录下残留了之前编译运行生成的旧.gcda文件:哪怕你本次构建每个文件只编译一次,只要是全新执行的编译动作,生成的插桩目标文件携带的时间戳就和历史残留.gcda里记录的时间戳不一致,运行时校验失败就会抛出该错误。
- 编译和运行阶段的工作目录不匹配,导致程序运行时读取到了其他编译版本、其他项目生成的同名.gcda文件,时间戳自然无法匹配。
处理方案
- 每次重新编译插桩版本程序前,先清空工作目录下所有残留的
.gcda、.gcno覆盖率文件,再执行编译、运行流程,避免历史文件干扰。 - 保持编译、运行程序时的工作目录一致;如果需要自定义覆盖率文件的存储路径,编译时添加
-fprofile-dir=你的目标路径参数,固定gcov产物的读写位置,避免路径错乱读到无关文件。 - 不要手动将其他来源的.gcda文件复制到当前项目的工作目录下。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

