使用gcov进行交叉配置,但忽略GCOV_PREFIX和GCOV_PREFIX_STRIP

我想使用GCOV进行代码覆盖,但测试将在另一台机器上运行。 因此,可执行文件中.gcda文件的硬连接路径将不起作用。

为了更改此默认目录,我可以使用GCOV_PREFIX和GCOV_PREFIX_STRIP env变量,如此处所述。

这是我使用的命令:

$ export GCOV_PREFIX="/foo/bar" $ export GCOV_PREFIX_STRIP="3" $ gcc main.c -fprofile-arcs -ftest-coverage $ strings a.out | grep gcda /home/calmarius/blahblah/main.c.gcda 

路径保持不变。 有人有这方面的经验吗?

运行代码时会考虑环境变量。

在运行测试之前将它们设置为目标计算机上的适当值,并且将在您希望的位置生成.gcda文件。

************ ARRRRGGGGGHHHHH ************

请投票给Mat的答案。

运行代码时会考虑环境变量。

在我阅读的有关如何重新定位输出的每个文档中,显然缺少这一句话!

事实上,请允许我稍微扩展一下这个答案。

GCOV_PREFIX是一个运行时 – 与构建时间相关 – 环境变量,并确定写入gcov输出文件(* .gcda)的根目录。

GCOV_PREFIX_STRIP = X也是一个运行时变量,具有从目标文件中找到的路径中剥离X元素的效果(字符串XXXX.o)

这意味着:

构建项目时,目标文件将使用完整路径写入每个源文件的位置,该文​​件负责嵌入其中的每个目标文件。

所以,想象一下你在一个像这样的目录中写一个可执行的MyApp和一个库MyLib:

 /MyProject |-MyApp |--MyLib 

注意MyLib是MyApp的子目录

假设MyApp有2个源文件,MyLib有3个

使用“-coverage”标志构建后,您将为每个目标文件生成5个.gcno文件,1个。

嵌入在MyApp的.o文件中将是绝对路径** / MyProject / MyApp / ** a_source_file.cpp同样,嵌入在.o文件中的MyLib将是路径** / MyProject / MyApp / MyLib / ** another_source_file.cpp

现在,假设您和我一样,将这些文件移动到一台完全不同的机器上,该机器具有与构建它们不同的目录结构。 在我看来,目标机器实际上是一个完全不同的架构。 我在那台机器上部署到/ some / deploy / path not / MyProject。

如果您只是运行应用程序,gcov数据将尝试将相应的.gcda文件写入项目中每个目标文件的/ MyProject / MyApp和/ MyProject / MyApp / MyLib,因为这是.o文件指示的路径,之后所有,MyApp和MyLib都只是归档在一起的.o文件的集合,还有一些其他魔法来修复function指针和东西。

可能是,那些目录不存在,你可能没有以root身份运行(是吗?),所以这些目录也不会被创建。 Soooo ..你不会在部署位置/ my / deploy / path中看到任何gcda文件。

这完全令人困惑,对吧!?!??!?!?!?

这是GCOV_PREFIX和GCOV_PREFIX_STRIP进来的地方。

(BAM!拳击前额)你需要指示****运行时**** .o文件中的嵌入路径并不是你想要的。 您想要“删除”某些路径,并将其替换为deploy目录。

因此,您通过GCOV_PREFIX = / some / deploy / path设置部署目录,并且要从生成的.gcda路径中剥离/ MyProject,以便设置GCOV_PREFIX_STRIP = 1

设置这两个环境变量后,运行你的应用程序,然后查看/ some / deploy / path / MyApp和/ some / deploy / path / MyApp / MyLib,看看5个gcda文件奇迹般地出现,每个对象一个文件。

注意:如果您没有源代码构建,问题就更复杂了。 .o指向源,但gcda将相对于构建目录编写。